我有一个线程数组。他们每个人都连续调用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。但为了正确更新屏幕,我必须移动一次,暂停,更新,然后再次移动。这就是为什么我需要能够在机器人完成后“暂停”它并让程序在更新屏幕之前等待其他程序。
希望更有意义。
答案 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()