簡體   English   中英

調度程序在多線程下處於空閑狀態

[英]Scheduler going idle under multithreading

我運行的是Python 3.3.2,Win7 / Pro,64位,並且有一些代碼試圖在其自己的線程中運行調度程序。 看來,當調度程序清空其工作隊列時,它變得空閑並且即使將新條目添加到隊列中也不會繼續。 從文檔中可以恢復的文檔對我來說並不完全清楚,但是我不希望用戶代碼(在調度程序控制之外的線程中運行)不必擔心調度程序“完成”的可能性。 。 我懷疑有些東西我不理解和/或以某種方式濫用了它,但是我不知道在哪里。

在下面的示例中,我通過用自己的調度程序的enter方法替換了調度程序的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()

根據文檔sched將使用run()運行所有計划的事件。 文本有點晦澀,但是我相信一旦所有計划的事件完成, run()返回。 如果是這種情況,您將需要添加更多事件並再次調用run() ,並且鑒於報告的結果似乎正在發生。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM