2015-09-28 32 views
4

在自己的項目中有多個標誌是這樣的:Python的份額值

file_a = False 
file_b = False 
file_c = False 

,我試圖運行兩個過程,一個(從現在叫它A)處理有關消息隊列收到的消息,第二(從現在開始稱它爲B)處理一些數據處理。 B操作布爾標誌,A設置這些值:

def a(): 
    while True: 
     ... 
     ... 
     file_a = True 
     ... 

def b(): 
    while True: 
     ... 
     if file_a: 
      process(file_a) 
      ... 

a_proc = Process(target=a) 
b_proc = Process(target=b) 
a_proc.start() 
b.proc.start() 

但是這些值似乎沒有改變。我讀過我應該使用線程,它似乎工作,但我的準則是不使用線程和使用多處理

回答

6

如果您需要與多處理模塊進程之間交換數據,您可以直接共享內存:

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() 
+0

謝謝!有一種更簡單的方法嗎? – Amir

0

file_a, file_b, file_c被加載到每個進程分開。您需要使用Valuemultiprocessing

+0

你的答案可以真正使用一些解釋和例子 – akalikin

+1

更多的評論,因爲它現在 – akalikin

+0

@akalikin即時新的這裏。將添加評論 –