Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 由一个进程更改并影响其他进程的全局布尔值_Python_Python 3.x_Multiprocessing_Python Multiprocessing - Fatal编程技术网

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

Python 由一个进程更改并影响其他进程的全局布尔值,python,python-3.x,multiprocessing,python-multiprocessing,Python,Python 3.x,Multiprocessing,Python Multiprocessing,我有两个进程具有相同的布尔值。此布尔值上的更改对其他进程没有影响 def func1():#用于更改布尔值的函数 全球布尔瓦尔 如果(布尔瓦尔) 布尔瓦尔=假 ... def func1():#函数对frm func1的更改没有影响 全球布尔瓦尔 如果(布尔瓦尔) ... boolVar=True#在“if uuuu name uuuuu==”uuuu main uuuuuuuu:”中的var p1=多进程。进程(target=func1,args=(boolVar))#我的进程 p2=多处理。

我有两个进程具有相同的布尔值。此布尔值上的更改对其他进程没有影响

def func1():#用于更改布尔值的函数
全球布尔瓦尔
如果(布尔瓦尔)
布尔瓦尔=假
...
def func1():#函数对frm func1的更改没有影响
全球布尔瓦尔
如果(布尔瓦尔)
...
boolVar=True#在“if uuuu name uuuuu==”uuuu main uuuuuuuu:”中的var
p1=多进程。进程(target=func1,args=(boolVar))#我的进程
p2=多处理。进程(目标=func2,参数=(布尔瓦尔))
p1.开始()
p2.start()

我需要
func1
的更改影响
func2
。如何做到这一点?

进程的内存是相互分离的,不是通过Python而是通过操作系统。这样做是出于安全考虑

您需要的是进程间通信。由于您已经使用了
多处理
库,请查看

$python3 multi.py


成功了

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

下面是一个可运行的方法,它是按照您问题中的伪代码行应用的。它使用
数组
'i'
作为整数,因为没有一个数组专门用于布尔值-但这没关系,因为在Python中布尔值是
int
的子类

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

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

这是正确的答案。尝试在多个进程之间共享内存是一项容易出错且有风险的任务。我同意Thomas的观点,IPC是传递消息的正确方式。我的答案是,如果你想要一个IPC的替代品,那就用一些黑面条吧
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()