我想用两个线程遍历一个列表。一个从头部开始,另一个从尾部开始,并在每次迭代时将元素放入队列中。但是,在将值放入队列之前,我需要检查值是否已经存在于队列中(即当其中一个线程将该值放入队列时)。因此,当这种情况发生时,我需要停止线程并返回每个线程遍历的值列表。
以下是我迄今为止尝试过的内容:
现在,如果我先启动
以下是我迄今为止尝试过的内容:
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在这些情况下处理线程不同?如何终止线程并使它们相互通信?