Python线程暂停和等待

时间:2010-01-07 00:00:58

标签: python multithreading

我有一个线程数组。他们每个人都连续调用run方法。在每次运行方法结束时,我希望它们暂停并等待。

如何让线程一次执行一个,然后在完成所有操作后继续循环?我需要他们总是按顺序执行(即:1,2,3,4-1,2,3,4 ......)

我目前正在使用threading.Event,但结果不一致。

由于

更新

感谢大家到目前为止的答案。

我在python中写了类似于Robocode的东西。玩家编写一个机器人,机器人一直在争夺它,直到剩下一个。在每次“转动”之后,机器人被“暂停”然后更新并被绘制到屏幕上。然后他们都开始了新的转折。

示例:

# Bot extends threading.Thread
class DemoBot(Bot):
    def __init__(self):
        super(DemoBot, self).__init__()

    def run(self):
        while True:
            self.moveForward(100)
            self.turnLeft(90)

正如您所看到的,机器人处于无限循环中。在moveForward方法中,机器人将向前移动100px。但为了正确更新屏幕,我必须移动一次,暂停,更新,然后再次移动。这就是为什么我需要能够在机器人完成后“暂停”它并让程序在更新屏幕之前等待其他程序。

希望更有意义。

2 个答案:

答案 0 :(得分:3)

您的描述似乎暗示您不希望线程同时执行,这会让您怀疑为什么您首先使用线程。

我感觉到两个可能的答案,为什么你想要这样做。

第一种可能性是您试图阻止线程同时处理某种共享资源。如果是这种情况,您可能希望使用threading.Lock或threading.RLock来锁定关键代码部分。 (下面的例子是为python 2.5+编写的,你需要在老蟒蛇上使用显式锁获取/释放)

from __future__ import with_statement # only needed on python 2.5
from threading import Lock
lock = Lock()


def worker1():
    #noncritical code
    with lock:
        pass # critical code in here

def worker2():
    with lock:
        critical_code

但是,这不会强制执行任何排序。当多个线程尝试获取一个锁时,除了一个之外的所有线程都会阻塞(并且下一个获取锁定的是不确定的)

你提到订购这一事实让我觉得你正在进行某种生产者 - 消费者循环。也就是说,一个线程生成一些下一个需要使用的输出。您可以使用queue.Queue在线程之间提供数据,并让它们唤醒以吞噬下一位数据。

from queue import Queue

one_to_two = Queue(maxsize=10)    

def worker1():
    while i_have_some_data_stream:
        data = get_data_from_somewhere()
        modified_data = munge_data_somehow(data)
        one_to_two.put(modified_data) #blocks only if queue is currently full

def worker2():
     while True:
        data = one_to_two.get() # blocks until data available
        # do something with data
        # Optionally, put this newly processed data into the next queue.

队列是一个强大的原语,可以让您在线程之间传递消息并实现有界的生产者 - 消费者。如果这是您的用例,则队列将比尝试手动同步您的线程的顺序更有效。

答案 1 :(得分:0)

可能像

while True:
  list = []
  for i in xrange(100):
    t = myThread(data[i])
    list.append(t)
    t.start()
  for t in list: t.join()