【问题标题】:Multiprocessing function not calling Python 3多处理函数不调用 Python 3
【发布时间】:2018-11-05 21:11:51
【问题描述】:

这是我的代码:

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 是否仍然可以被父进程和子进程读取?

提前致谢!

【问题讨论】:

    标签: python python-3.x multiprocessing


    【解决方案1】:

    您的代码很好。我认为这确实只是您特定机器上的时间问题。当我运行你的代码时,我可以看到 ca. 70x“你好”,然后是数字。所以我开始插入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)实际上肯定比新分叉的“greet”进程慢,所以当最后第一个print(string.value)被执行时,“hello”早就被覆盖了.

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-20
      • 1970-01-01
      • 2020-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多