Ian*_*Ian 10 python multithreading loops
我有一个线程将行追加到self.output和一个循环,直到self.done为True(或达到最大执行时间).
除了使用不断检查以查看是否已完成的while循环之外,是否有更有效的方法来执行此操作.while循环导致CPU在运行时加速到100%.
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
Run Code Online (Sandbox Code Playgroud)
Bri*_*ian 11
你的线程是否附加到self.output,主要任务是否正在使用它们?如果是这样,这是Queue.Queue的一个量身定制的工作.你的代码应该像这样:
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"
Run Code Online (Sandbox Code Playgroud)
您的生产者线程将项目添加到队列中 queue.put(item)
[编辑]检查self.done时原始代码存在竞争问题(例如,在设置标志之前可能会将多个项目附加到队列中,从而导致代码在第一个代码中挽救).更新了来自ΤΖΩΤΖΙΟΥ的建议 - 生产者线程应该在队列中附加一个特殊标记(已完成)以指示它已完成.
注意:如果您有多个生产者线程,则需要更通用的方法来检测它们何时完成.您可以使用相同的策略完成此操作 - 每个线程都是Finished标记,而消费者在看到num_threads标记时终止.
归档时间: |
|
查看次数: |
13668 次 |
最近记录: |