代码之家  ›  专栏  ›  技术社区  ›  Ian Baget

python-线程和一个while-true循环

  •  9
  • Ian Baget  · 技术社区  · 15 年前

    我有一个线程将行追加到self.output,还有一个循环一直运行到self.done为真(或者达到最大执行时间)。

    除了使用一个经常检查是否完成的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
    
    5 回复  |  直到 15 年前
        1
  •  11
  •   Brian    15 年前

    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"
    

    queue.put(item)

        2
  •  1
  •   esm    15 年前

    self.done = threading.Semaphore() self.done.release() self.done.acquire()

    issue 描述在标准库中需要信号量超时。

        3
  •  0
  •   moinudin    15 年前

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

    例子:

    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
    
        4
  •  0
  •   Francis    15 年前

    使用互斥模块或事件/信号量

        5
  •  0
  •   Bastien Léonard    15 年前

    您必须在这里使用同步原语。看这里: http://docs.python.org/library/threading.html .

    事件对象看起来非常简单,应该可以解决您的问题。您还可以使用条件对象或信号量。

    我不会发布一个示例,因为我从未使用过事件对象,而且替代方法可能不那么简单。


    编辑: 我真的不确定我理解你的问题。如果一个线程可以等到某个条件稳定下来,那么就使用同步。否则 sleep() 有人发布的解决方案会占用太多的CPU时间。