代码之家  ›  专栏  ›  技术社区  ›  Jared Forth Lakshmanan Ganesan

具有复杂函数的Python多处理

  •  0
  • Jared Forth Lakshmanan Ganesan  · 技术社区  · 7 年前

    我知道这个问题已经被问到了,但我已经做了广泛的研究,无法解决我的问题。

    我的问题与跑步有关 并行复杂函数

    我使用selenium webdriver自动从一个网站下载文件并将其上载到另一个网站,我希望这些功能同时运行。他们都使用 while循环 并具有分层条件语句。我无法同时运行这些函数,希望您能提供帮助。我的代码如下:

    import multiprocessing
    
    def auto_download():
    
        # function logic here 
    
    def auto_upload():
    
        # function logic here 
    
    if __name__ == '__main__':
    
    p1 = multiprocessing.Process(name='auto download', target=auto_download())
    p2 = multiprocessing.Process(name='auto upload', target=auto_upload())
    p1.start()
    p2.start()
    

    此代码运行第一个函数 auto\u下载() 但从不开始第二次。

    但是,如果我从 here ,这是相同的想法,但功能更简单,工作正常。

    import multiprocessing
    import time
    
    def add():
        while True:
            print (1)
            time.sleep(3)
    
    def sud():
        while True:
            print(0)
            time.sleep(3)
    
    if __name__ == '__main__':
        p1 = multiprocessing.Process(name='p1', target=add)
        p = multiprocessing.Process(name='p', target=sud)
        p1.start()
        p.start()
    

    我的问题是否源于我试图同时运行的函数的复杂性?提前感谢您的帮助!

    编辑:解决方案(感谢 Raw Dawg )我是直接调用函数,而不是在process对象中。这与 this question 。以下代码修复了该问题:

    p1 = multiprocessing.Process(name='auto download', target=auto_download)
    p2 = multiprocessing.Process(name='auto upload', target=auto_upload)
    p1.start()
    p2.start()
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Sevy    7 年前

    我想我在这里发现了问题——当你用

    p1 = multiprocessing.Process(name='auto download', target=auto_download())
    

    您正在运行函数 auto_download() 。实际上,您是在主流程中启动此函数,而不是在您想要的流程对象中。出于这个原因 p1.start() 没有您想要的效果,因为您没有同时运行这些函数。请注意,在流程签名的第二个示例中,您将其定义为

    p1 = multiprocessing.Process(name='p1', target=add)
    

    后面没有括号 add 。请使用以下代码重试:

    p1 = multiprocessing.Process(name='auto download', target=auto_download)
    p2 = multiprocessing.Process(name='auto upload', target=auto_upload)
    p1.start()
    p2.start()