【发布时间】:2015-05-08 12:08:21
【问题描述】:
我想使用 2 个线程遍历一个列表。一个来自前导,另一个来自尾随,并在每次迭代时将元素放在Queue 中。但是在将值放入Queue 之前,我需要检查Queue 中是否存在该值(当其中一个线程将该值放入Queue 时),所以当这种情况发生时我需要停止线程并返回每个线程的遍历值列表。
这是我迄今为止尝试过的:
from Queue import Queue
from threading import Thread, Event
class ThreadWithReturnValue(Thread):
def __init__(self, group=None, target=None, name=None,
args=(), kwargs={}, Verbose=None):
Thread.__init__(self, group, target, name, args, kwargs, Verbose)
self._return = None
def run(self):
if self._Thread__target is not None:
self._return = self._Thread__target(*self._Thread__args,
**self._Thread__kwargs)
def join(self):
Thread.join(self)
return self._return
main_path = Queue()
def is_in_queue(x, q):
with q.mutex:
return x in q.queue
def a(main_path,g,l=[]):
for i in g:
l.append(i)
print 'a'
if is_in_queue(i,main_path):
return l
main_path.put(i)
def b(main_path,g,l=[]):
for i in g:
l.append(i)
print 'b'
if is_in_queue(i,main_path):
return l
main_path.put(i)
g=['a','b','c','d','e','f','g','h','i','j','k','l']
t1 = ThreadWithReturnValue(target=a, args=(main_path,g))
t2 = ThreadWithReturnValue(target=b, args=(main_path,g[::-1]))
t2.start()
t1.start()
# Wait for all produced items to be consumed
print main_path.join()
我使用了ThreadWithReturnValue,它将创建一个返回值的自定义线程。
对于成员资格检查,我使用了以下功能:
def is_in_queue(x, q):
with q.mutex:
return x in q.queue
现在,如果我先启动t1,然后启动t2,我会得到12 个a,然后是一个b,那么它什么也做不了,我需要手动终止python!
但如果我先运行t2 然后t1 我会得到以下结果:
b
b
b
b
ab
ab
b
b
b
b
a
a
所以我的问题是,为什么 python 在这种情况下会有所不同?以及如何终止线程并使它们相互通信?
【问题讨论】:
-
看这里pymotw.com/2/multiprocessing/communication.html ...您对管理共享状态更感兴趣
-
@OWADVL 听起来很有用,我会看到的!谢谢!
-
您是否有从列表两端进行迭代的实际需求,或者您只是将其作为划分任务的一种方式?
标签: python multithreading python-2.7