我想使用 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()
I used ThreadWithReturnValue
这将创建一个返回值的自定义线程。
为了进行成员资格检查,我使用了以下函数:
def is_in_queue(x, q):
with q.mutex:
return x in q.queue
现在如果我首先开始t1
然后是t2
我会得到12a
然后一个b
那么它不会做任何事情,我需要手动终止 python!
但如果我首先运行t2
then t1
我会得到以下结果:
b
b
b
b
ab
ab
b
b
b
b
a
a
所以我的问题是为什么 python 在这种情况下表现不同?我怎样才能终止线程并使它们相互通信?