使用并行编程,做事的方法总是不止一种。所以其他人可能对如何做到这一点有完全不同的想法。
首先想到的方式是通过Event。保留其中三个,并根据需要打开/关闭它们。
from threading import Thread, Event
def worker1(events):
a,b,c = events
while True:
a.wait() # sleep here if 'a' event is set, otherwise continue
# do work here
if some_condition:
c.clear() # put c to sleep
b.set() # wake up, b
def worker2(events):
a,b,c = events
while True:
b.wait()
#do work
if some_condition:
a.clear()
c.set()
def worker3(events):
a,b,c = events
while True:
c.wait()
#do work
if some_condition:
b.clear()
a.set()
然后启动它们:
events = [Event() for _ in range(3)]
events[0].set()
events[1].set()
#events[2] starts un-set, i.e. worker3 sleeps at start
threads = []
threads.append(Thread(target=worker1, args=(events,)))
threads.append(Thread(target=worker2, args=(events,)))
threads.append(Thread(target=worker3, args=(events,)))
for t in threads:
t.start()
for t in threads:
t.join()
未经测试的粗略代码,比它需要的更冗长(你可以用一个工人 def 编写这一切,需要一些额外的参数),但希望你能走上正确的道路。