我想使用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
所以我的問題是,爲什麼蟒蛇胎面在這種情況下,有什麼不同?以及如何終止線程並使它們彼此通信?
看看這裏http://pymotw.com/2/multiprocessing/communication.html ...你更感興趣的是管理共享狀態 – OWADVL
@OWADVL聲音有用,我會看到的!謝謝! – Kasramvd
您是否有從列表兩端進行迭代的實際要求,或者您是否只是將其作爲劃分任務的一種方式? – 101