簡體   English   中英

Python多重處理流程:使用Manager Queue時延遲識別事件

[英]Python Multiprocessing Processes: Delay in recognizing Event when using Manager Queue

我有以下代碼:

from multiprocessing import Process, Manager, Event

manager = Manager()
shared_Queue = manager.Queue(10)
ev = Event()

def do_this(shared_queue, ev):
    while not ev.is_set():
        if not shared_Queue.__getattribute__('empty')():
           item = shared_queue.get()
           print item
    print 'released!'

subprocs = []
for i in xrange(10):
    subproc = Process(target=do_this, args=(shared_Queue, ev, ))
    subprocs.append(subproc)
    subproc.start()

現在,如果我運行此命令,請問這些過程是否仍然有效:

for subproc in subprocs: print subproc.is_alive()

當然,我得到了所有的真理。

經過以下操作:*如果我不執行這些操作就沒有錯誤!

shared_Queue.put(3)
shared_Queue.put(5)

現在,我想設置事件使用以下命令殺死所有事件:

ev.set()

但隨后卻看不到“已發行!” 10次​​后,我得到的這些打印數量不等,大約2到5秒后,我收到了很多錯誤:

released!
released!
released!
released!
released!
released!
released!
Process Process-10:
Traceback (most recent call last):
  File 
 "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/
multiprocessing/process.py", line 258, in _bootstrap
    self.run()
  File 
"/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/
multiprocessing/process.py", line 114, in run
    self._target(*self._args, **self._kwargs)
  File "<input>", line 10, in do_this
  File "<string>", line 2, in get
  File 
"/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/
multiprocessing/managers.py", line 759, in _callmethod
    kind, result = conn.recv()
EOFError
Process Process-5:
Traceback (most recent call last):
  File 
"/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/
multiprocessing/process.py", line 258, in _bootstrap
    self.run()
  File 
"/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/
multiprocessing/process.py", line 114, in run
    self._target(*self._args, **self._kwargs)
  File "<input>", line 10, in do_this
  File "<string>", line 2, in get
  File 
"/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/
multiprocessing/managers.py", line 759, in _callmethod
    kind, result = conn.recv()
EOFError
Process Process-7:
Traceback (most recent call last):
  File 
"/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/
multiprocessing/process.py", line 258, in _bootstrap
    self.run()
  File 
"/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/
multiprocessing/process.py", line 114, in run
    self._target(*self._args, **self._kwargs)
  File "<input>", line 10, in do_this
  File "<string>", line 2, in get
  File 
"/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/
multiprocessing/managers.py", line 759, in _callmethod
    kind, result = conn.recv()
EOFError

為什么某些進程無法識別事件集並在以后顯示為錯誤? 有沒有更好的方法通知他們死亡?

感謝您的評論stovfl,您是對的,ev.set()不會殺死我不小心使用的任何單詞。

對於我遇到的問題,我了解到多處理隊列是進程和線程安全的,這意味着,如果隊列已滿,則在將某些內容寫入隊列之前,我的進程將停止。

如果在某些進程仍在等待將某些內容寫入完整隊列時嘗試設置事件,則它們將無法識別事件集。

關鍵是清空所有Queue,讓進程對其進行寫操作,然后到達可以檢查事件的第一行!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM