Python - 线程和一个真正的循环

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标记时终止.

  • 生产者应该Queue.put一个特殊的标记,它已经完成.要么使用`done_marker = object()`并使用它,要么可以使用省略号对象(通常无用). (2认同)