首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python线程和While True循环

Python线程和While True循环
EN

Stack Overflow用户
提问于 2009-04-30 19:57:07
回答 5查看 15K关注 0票数 10

我有一个将行附加到self.output的线程和一个运行到self.done为True (或达到最大执行时间)的循环。

有没有比使用while循环更有效的方法来做这件事,该循环不断地检查它是否完成了。while循环导致CPU在运行时达到100%。

代码语言:javascript
复制
time.clock()
while True:

    if len(self.output):
        yield self.output.pop(0)

    elif self.done or 15 < time.clock():
        if 15 < time.clock():
            yield "Maximum Execution Time Exceeded %s seconds" % time.clock()
        break
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-04-30 20:16:46

你的线程是否在这里附加到self.output,而你的主任务正在消耗它们?如果是这样的话,这是为Queue.Queue量身定做的工作。您的代码应该如下所示:

代码语言:javascript
复制
import Queue

# Initialise queue as:
queue = Queue.Queue()
Finished = object()   # Unique marker the producer will put in the queue when finished

# Consumer:
try:
    while True:
        next_item = self.queue.get(timeout=15)
        if next_item is Finished: break
        yield next_item

except Queue.Empty:
    print "Timeout exceeded"

生产者线程使用queue.put(item)将项添加到队列中

编辑在检查self.done时,原始代码存在竞争问题(例如,在设置标志之前,可能会将多个项目附加到队列中,从而导致代码在第一个项目时退出)。使用来自ΤΖΩΤΖΙΟΥ的建议进行更新-生产者线程应该改为将一个特殊的令牌(完成)附加到队列,以指示它已完成。

注意:如果你有多个生产者线程,你需要一种更通用的方法来检测它们何时都完成了。您可以使用相同的策略来实现这一点--每个线程都有一个完成的标记,当使用者看到num_threads标记时,它就会终止。

票数 11
EN

Stack Overflow用户

发布于 2009-04-30 20:04:29

使用一个信号量;让工作线程在它完成时释放它,并阻塞你的附加线程,直到工作线程完成信号量。

即。在worker中,在工作开始时执行self.done = threading.Semaphore(),完成后执行self.done.release()。在上面提到的代码中,只需执行self.done.acquire(),而不是繁忙的循环;当工作线程完成时,控制将返回。

编辑:不过,恐怕我没有解决您所需的超时值;这个issue描述了标准库中对信号量超时的需求。

票数 1
EN

Stack Overflow用户

发布于 2009-04-30 20:01:14

使用time.sleep(秒)在while循环的每次迭代后创建一个短暂的暂停,以释放cpu。您必须根据作业完成后快速捕获作业的重要性来设置每次迭代期间的睡眠时间。

示例:

代码语言:javascript
复制
time.clock()
while True:

    if len(self.output):
        yield self.output.pop(0)

    elif self.done or 15 < time.clock():
        if 15 < time.clock():
            yield "Maximum Execution Time Exceeded %s seconds" % time.clock()
            break

    time.sleep(0.01) # sleep for 10 milliseconds
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/808746

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档