由一个过程更改并影响其他过程的全局布尔

时间:2019-07-05 22:37:03

标签: python python-3.x multiprocessing python-multiprocessing

我有2个具有相同布尔值的进程。此布尔值的更改不会影响其他进程。

def func1():   # function wich changes the boolean
    global boolVar
    if(boolVar)
       boolVar = False
       ...

def func1():   # function wich have no effect on the change frm func1
    global boolVar
    if(boolVar)
    ...

boolVar = True # var in " if __name__ == "__main__": "

p1 = multiprocessing.Process(target=func1, args=(boolVar)) #my processes
p2 = multiprocessing.Process(target=func2, args=(boolVar))
p1.start()
p2.start()

我需要func1func2的影响。我该怎么办?

3 个答案:

答案 0 :(得分:2)

进程的内存不是通过Python而是通过操作系统彼此分离。出于安全原因这样做。

您所需要的称为进程间通信。由于您已经使用了multiprocessing库,因此请查看message passing with pipes

答案 1 :(得分:0)

import multiprocessing
boolVar=False
def func1(_bool):   # function wich changes the boolean
    global boolVar
    if not boolVar:
       boolVar = True

def func2():   # function wich have no efffect on the change frm func1
    global boolVar
    if boolVar:
        print('worked!')


boolVar = True # var in " if __name__ == "__main__": "

p1 = multiprocessing.Process(target=func1, args=(boolVar,)) #my processes
p2 = multiprocessing.Process(target=func2)
p1.start()
p2.start()

$ python3 multi.py

工作了!

答案 2 :(得分:0)

进程在单独的内存空间中运行,这意味着无法共享全局变量。该文档的标题为Sharing state between processes的部分讨论了在需要时解决此问题的一些方法。

在您的问题中,这是伪代码中适用的一种可运行方式。它使用array中的'i' type code来表示整数,因为没有一个专门用于布尔值的值,但是没关系,因为在Python中,布尔值是int的子类。

请注意,Value共享内存对象的当前值必须通过其value属性访问,如图所示。这是因为它们被实现为具有关联的Lock的对象代理,以防止并发访问。这样做的开销会大大减少从多处理本身获得的任何收益,具体取决于您要尝试执行的操作。

import multiprocessing
import time

def func1(boolVar):
    if boolVar.value:
       boolVar.value = False

def func2(boolVar):
    time.sleep(1)  # For testing, give other process time to execute.
    print(bool(boolVar.value))  # Show current "truthiness".


if __name__ == '__main__':
    boolVar = multiprocessing.Value('i', True)  # Create value in shared memory.

    p1 = multiprocessing.Process(target=func1, args=(boolVar,))
    p2 = multiprocessing.Process(target=func2, args=(boolVar,))
    p1.start()
    p2.start()
    p1.join()
    p2.join()