[英]Communicating with Process in Python 3.4 multiprocessing through function calling
我創建了一個新類,它是multiprocessing.Process的子類,我想在該類上調用方法。 這些方法可以更改類成員,但不帶參數,我認為應該透明地工作。 例如,在下面的MWE中,我創建一個從Process繼承的類,並具有一個stop()函數,該函數僅設置實例成員標志。 盡管設置了此標志,但run()方法似乎並未注意到更改。 當我從threading.Thread繼承時,這一切似乎都起作用。
from queue import Empty
import multiprocessing
class Worker(multiprocessing.Process):
def __init__(self, queue):
multiprocessing.Process.__init__(self) # , daemon=True)
self.queue = queue
self.close = False
def stop(self):
self.close = True
print(self.close)
def run(self):
while (not self.close) or self.queue.qsize() > 0:
print(self.close)
print(self.queue.qsize())
for item in range(0, self.queue.qsize()):
try:
self.queue.get_nowait()
except Empty:
continue
queue = multiprocessing.Queue()
dbq = Worker(queue)
dbq.start()
queue.put("d")
dbq.stop()
dbq.join()
您必須使用諸如multiprocessing.Value
東西在進程之間進行同步。
樣例代碼:
from queue import Empty
from ctypes import c_bool
import multiprocessing
class Worker(multiprocessing.Process):
def __init__(self, queue):
multiprocessing.Process.__init__(self) # , daemon=True)
self.queue = queue
self.close = multiprocessing.Value(c_bool, False)
def stop(self):
self.close.value = True
print(self.close)
def run(self):
while (not self.close.value) or self.queue.qsize() > 0:
print(self.close)
print(self.queue.qsize())
for item in range(0, self.queue.qsize()):
try:
self.queue.get_nowait()
except Empty:
continue
if __name__ == '__main__':
queue = multiprocessing.Queue()
dbq = Worker(queue)
dbq.start()
queue.put("d")
dbq.stop()
dbq.join()
進程不會像線程一樣與父進程共享內存空間。 fork
一個進程時,它將獲得父級內存的新副本,因此您無法像使用線程那樣輕松地共享(實際上,實際上是寫時復制 )。
我建議為了殺死工作人員,請使用Event
類的同步原語,因為通常為響應所發生的事情而將工作人員一起殺死。
您將得到如下所示的結果(注意,工作人員沒有stop
方法):
from queue import Empty
import multiprocessing
class Worker(multiprocessing.Process):
# added the event to the initializing function
def __init__(self, queue, close_event):
multiprocessing.Process.__init__(self) # , daemon=True)
self.queue = queue
self.close = close_event
def run(self):
while (not self.close.is_set()) or self.queue.qsize() > 0:
print(self.close)
print(self.queue.qsize())
for item in range(0, self.queue.qsize()):
try:
self.queue.get_nowait()
except Empty:
continue
queue = multiprocessing.Queue()
# create a shared event for processes to react to
close_event = multiprocessing.Event()
# send event to all processes
dbq = Worker(queue, close_event)
dbq.start()
queue.put("d")
# set the event to stop workers
close_event.set()
dbq.join()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.