Python共享值

Ami*_*mir 5 python python-2.7 python-multiprocessing

在我的项目中有一个像这样的多个标志:

file_a = False
file_b = False
file_c = False
Run Code Online (Sandbox Code Playgroud)

我正在尝试运行两个进程,一个(从现在起称为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()
Run Code Online (Sandbox Code Playgroud)

但价值似乎没有改变.我已经读过我应该使用线程,它似乎工作,但我的准则是不使用线程并使用多处理

aka*_*kin 14

如果需要在具有多处理模块的进程之间交换数据,则可以直接共享内存:

multiprocessing.Value

Value是ctypes对象的包装器,它具有表示内存中实际对象的基础值属性.所有Value都确保只有一个进程或线程可以同时读取或写入此值属性.

from multiprocessing import Value
file_a = Value('i', 0)
file_b = Value('i', 0)
file_c = Value('i', 1)
Run Code Online (Sandbox Code Playgroud)

这将为您的文件标志创建共享整数值.因为它是python,所以整数值和布尔值之间的转换很简单:

>>> 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
Run Code Online (Sandbox Code Playgroud)

一尝,但也许是更好的选择的优先级,你可以使用c_boolctypes:

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)>
Run Code Online (Sandbox Code Playgroud)

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}
Run Code Online (Sandbox Code Playgroud)

最后收集它们:

我将采用Manager方法,只是因为它会使代码更清晰:

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()
Run Code Online (Sandbox Code Playgroud)