我正在运行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()
答案 0 :(得分:0)
根据docs,sched
将使用run()
运行所有预定活动。文本有点模糊,但我相信run()
会在所有预定事件完成后返回。如果是这种情况,您需要添加更多活动并再次致电run()
,并根据您所报告的结果发现正在发生的事情。