私は Python 3.3.2、Win7/Pro、64 ビットを実行しており、独自のスレッドでスケジューラを実行しようとしているコードがいくつかあります。スケジューラが作業キューを空にすると、アイドル状態になり、新しいエントリがキューに追加されても再開されないようです。ドキュメントから再開することになっていることは完全には明らかではありませんが、スケジューラーが「終了」した可能性についてユーザーコード (スケジューラーの制御外のスレッドで実行されている) が心配する必要はないと思います。 . 私が理解していないこと、および/または何らかの形で誤用していると思われますが、どこにあるのかわかりません。
以下の例では、スケジューラの enter メソッドをキューの長さをチェックする独自のものに置き換えることで問題を解決し、キューの長さがゼロの場合はリクエストを入力してから、スケジューラの run メソッドを再度呼び出します。これは機能しているように見えますが、間違いなく間違っていると感じています。足りないものはありますか?
class A(threading.Thread):
def __init__(self):
super().__init__()
self.schedControl = sched.scheduler(time.time, time.sleep)
self.senter = self.schedControl.enter
self.schedControl.enter = self.enter
def print_time(self, a=''):
"""Print current time and optional message."""
tmx = time.time()
tms = time.strftime("%a, %d %b %Y %H:%M:%S", time.localtime(tmx))
print("{0}: {1}".format(tms, a))
def run(self):
#for call by thread's start method
self.schedControl.run()
def enter(self, *args, **kwargs):
tmp = False
if len([x for x in self.schedControl.queue]) == 0:
tmp = True
self.senter(*args, **kwargs)
if tmp:
print("Restart")
self.schedControl.run()
class B(object):
def __init__(self):
self.scheduler = A()
self.itemCount = 0
self.scheduler.schedControl.enter(1, 1, self.scheduler.print_time, argument=('Starting Scheduler',))
self.scheduler.start()
def newItem(self):
self.scheduler.schedControl.enter(1, 1, self.scheduler.print_time, argument=('New Item: {0}'.format(self.itemCount),))
self.itemCount += 1
foo = B()
foo.newItem()
time.sleep(5)
foo.newItem()
time.sleep(5)
foo.newItem()
time.sleep(5)
foo.newItem()
time.sleep(5)
foo.newItem()
print("Going to sleep")
time.sleep(100)
sys.exit()