我在下面的代码中使用python中的多处理库:
from multiprocessing import Process
import os
from time import sleep as delay
test = "First"
def f():
global test
print('hello')
print("before: "+test)
test = "Second"
if __name__ == '__main__':
p = Process(target=f, args=())
p.start()
p.join()
delay(1)
print("after: "+test)
它应该更改test
的值,所以最后test的值必须是Second
,但值不会改变并保持First
。
这是输出:
hello
before: First
after: First
答案 0 :(得分:1)
您看到的行为是因为p是新的进程,而不是新的线程。当您生成一个新进程时,它会完全复制您的初始进程状态,然后开始并行执行。当你产生一个线程时,它与你的初始线程共享内存。
由于进程具有内存隔离,因此它们不会因读取和写入共享内存而导致创建竞争条件错误。但是,要将子进程中的数据恢复到父进程,您需要使用某种形式的进程间通信(如管道),并且因为它们分叉内存,所以它们的生成成本更高。和计算机科学一样,你必须做出权衡。
有关详细信息,请参阅:
根据您实际尝试完成的内容,请考虑使用线程。
答案 1 :(得分:0)
不共享全局状态,因此子进程所做的更改不起作用。
原因如下:
实际上它确实改变了全局变量,但仅用于生成变量 处理。如果您要在流程中访问它,您可以看到它。如 它是一个过程,你的全局变量环境将被初始化但是 您所做的修改将仅限于流程本身和 不是全部。
试试这个它解释了发生了什么
from multiprocessing import Process
import os
from time import sleep as delay
test = "First"
def f2():
print ("f2:" + test)
def f():
global test
print ('hello')
print ("before: "+test)
test = "Second"
f2()
if __name__ == '__main__':
p = Process(target=f, args=())
p.start()
p.join()
delay(1)
print("after: "+test)