如果您需要與多處理模塊進程之間交換數據,您可以直接共享內存:
multiprocessing.Value
值是圍繞一個ctypes對象,該對象具有表示在存儲器中的實際對象的基礎值屬性的包裝。所有值的作用是確保只有一個進程或線程可以同時讀取或寫入該值屬性。
from multiprocessing import Value
file_a = Value('i', 0)
file_b = Value('i', 0)
file_c = Value('i', 1)
這將爲您的文件標誌創建共享整數值。由於它是蟒蛇,整數值和布爾值之間的轉換很簡單:
>>> Value('i', True)
<Synchronized wrapper for c_int(1)>
>>> Value('i', False)
<Synchronized wrapper for c_int(0)>
>>> bool(Value('i', False).value)
False
>>> bool(Value('i', 50).value)
True
味道的偏好,但也許是更好的選擇,你可以使用c_bool
從:
from multiprocessing import Value
from ctypes import c_bool
file_a = Value(c_bool, False)
file_n = Value(c_bool, False)
file_c = Value(c_bool, True)
>>> Value(c_bool, False)
<Synchronized wrapper for c_bool(False)>
>>> Value(c_bool, 5)
<Synchronized wrapper for c_bool(True)>
multiprocessing.Manager
詞典:
要收集多個布爾標誌,您可以使用字典,但它需要在進程之間共享,因此Manager()可派上用場。
from multiprocessing import Manager
manager = Manager()
flags = manager.dict({'file_a' : False, 'file_b' : False, 'file_c' : True})
>>> flags
<DictProxy object, typeid 'dict' at 0x7f70822f06d0>
>>> flags['file_a']
False
>>> dict(flags)
{'file_a': False, 'file_c': True, 'file_b': False}
最後收集它們放在一起:
我將與管理方法去,只是因爲它會使代碼更加清晰:
from multiprocessing import Process, Manager
manager = Manager()
def a():
while True:
...
...
flags['file_a'] = True
...
def b():
while True:
...
if flags['file_a']:
process(file_a)
...
if __name__ == '__main__':
flags = manager.dict({'file_a' : False, 'file_b' : False, 'file_c' : True})
a_proc = Process(target=a)
b_proc = Process(target=b)
a_proc.start()
b.proc.start()
謝謝!有一種更簡單的方法嗎? – Amir