多处理函数未调用Python 3

时间:2018-11-05 12:38:07

标签: python python-3.x multiprocessing

这是我的代码:

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 multiprocessing not calling function,并且正在从命令行运行代码。仍然不起作用

首先,如果有人可以告诉我为什么仅在最后调用该函数以及如何修复该函数,我很想这样做。如果可以解决,string仍可以被父进程和子进程读取吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

您的代码很好。我认为这确实只是您特定计算机上的计时问题。当我运行您的代码时,我可以看到ca。 70x“你好”,然后数字。因此,我开始插入sleep(),看到发生的事情真的很有趣:

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
...

没有“你好”,因为实际上保证了sleep(0.5)中的__main__比新派生的“ greet”过程慢,因此,当最后执行第一个print(string.value)时,“你好”早已被覆盖。

您的代码还可以,但是您对程序哪一部分需要花费多长时间的假设是错误的(至少对于您的机器而言)。玩一点睡眠。这很有启发性。