这是我的代码:
from multiprocessing import Process, Manager, Value
from ctypes import c_char_p
def greet(string):
print('bob')
string.value = '1'
for i in range(100):
string.value = str(i)
if __name__ == '__main__':
manager = Manager()
string = manager.Value(c_char_p, "Hello")
process = Process(target=greet, args=(string,))
process.start()
for j in range(100):
print(string.value)
process.join()
input()
现在,我希望代码能打印出这样的内容:
Hello
1
1
1
4
4
5
5
6
7
因为,当然,我知道这两个循环可能会以不同的速度运行。但所有的代码打印都是一个Hello
,一百次,它甚至不打印bob
,直到代码结束,我调用process.join()
。就像greet
直到我调用process.join()
才运行一样。我已经读过Python多处理不调用函数,并且我正在从命令行运行代码。它仍然不起作用
首先,我希望有人能告诉我为什么函数最终只被调用,以及如何修复它。如果可以修复,string
仍然可以被父进程和子进程读取吗?
提前感谢!
您的代码很好。我认为这实际上只是您特定机器的时间问题。当我运行你的代码时,我可以看到大约70倍的"你好",然后是数字。所以我开始插入sleep()
s,看看会发生什么真的很有趣:
from multiprocessing import Process, Manager, Value
from ctypes import c_char_p
import time
def greet(string):
print('bob')
string.value = '1'
for i in range(100):
string.value = str(i)
time.sleep(0.1)
if __name__ == '__main__':
manager = Manager()
string = manager.Value(c_char_p, "Hello")
process = Process(target=greet, args=(string,))
process.start()
time.sleep(0.5)
for j in range(100):
print(string.value)
time.sleep(0.2)
process.join()
input()
在我的机器上,我现在得到:
bob
4
6
8
10
...
没有"hello",因为__main__
中的sleep(0.5)
实际上保证比新分叉的"helle"进程慢,所以当最后执行第一个print(string.value)
时,"hello"早就被覆盖了。
你的代码很好,但你对程序的哪一部分需要多长时间的假设是错误的(至少对你的机器来说是这样(。玩一会儿睡眠。这很有启发性。