Python 线程暂停和等待
我有一个线程的数组。每个线程都会不断调用一个叫做 run 的方法。在每次 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 方法中,机器人会向前移动 100 像素。但为了正确更新屏幕,我需要先移动一次,暂停,更新,然后再移动一次。这就是我需要在机器人完成后“暂停”它,并让程序等待其他机器人再更新屏幕的原因。
希望这样能更容易理解一些。
2 个回答
可能像这样
while True:
list = []
for i in xrange(100):
t = myThread(data[i])
list.append(t)
t.start()
for t in list: t.join()
你的描述似乎表明你不想让线程同时执行,这样就让人怀疑你为什么要使用线程了。
我觉得有两种可能的原因让你想这样做。
第一种可能是你想防止多个线程同时处理某个共享资源。如果是这样的话,你可能需要使用 threading.Lock 或 threading.RLock 来锁定你的关键代码部分。(下面的例子是针对 Python 2.5 及以上版本的,如果你用的是更旧的 Python,需要手动处理锁的获取和释放)
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.
队列是一种强大的工具,可以让你在线程之间传递消息,并实现有界的生产者-消费者模式。如果这是你的使用场景,使用队列会比手动同步线程的顺序更高效。