periods; at the moment the only convention is that all sliver accounts
have type that begins with sliver.
+There are any number of race conditions that may result from the fact
+that account names are not unique over time. Moreover, it's a bad
+idea to perform lengthy operations while holding the database lock.
+In order to deal with both of these problems, we use a worker thread
+for each account name that ever exists. On 32-bit systems with large
+numbers of accounts, this may cause the NM process to run out of
+*virtual* memory! This problem may be remedied by decreasing the
+maximum stack size.
"""
import Queue
# private account name -> worker object association and associated lock
name_worker_lock = threading.Lock()
-# dict of account_name: <Worker Object>
name_worker = {}
def allpwents():
"""Return the worker object for a particular username. If no such object exists, create it first."""
name_worker_lock.acquire()
try:
- if name not in name_worker:
- logger.verbose("Accounts:get(%s) new Worker" % name)
- name_worker[name] = Worker(name)
+ if name not in name_worker: name_worker[name] = Worker(name)
return name_worker[name]
finally: name_worker_lock.release()
def stop(self): self._acct.stop()
def is_running(self):
- if self._acct.is_running():
+ if (self._acct != None) and self._acct.is_running():
status = True
else:
status = False