我知道这个问题已经被问过了,但我做了广泛的研究,无法弄清楚我的问题。
我的问题与并行运行复杂函数有关。
我正在使用 selenium 网络驱动程序自动从一个网站下载文件并将它们上传到另一个网站,我希望这些功能同时运行。它们都使用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_download(),但从不启动第二个函数。
但是,如果我从这里运行以下代码,这是相同的想法,但功能简单得多,它可以正常工作。
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)是我直接调用函数而不是在进程对象中调用。这与此问题的解决方案不同。以下代码修复了此问题:
p1 = multiprocessing.Process(name='auto download', target=auto_download)
p2 = multiprocessing.Process(name='auto upload', target=auto_upload)
p1.start()
p2.start()
我想我在这里发现了问题 - 当你定义你的过程时
p1 = multiprocessing.Process(name='auto download', target=auto_download())
您正在运行函数auto_download()
。您实际上是在主进程中启动此函数,而不是在您想要的 Process 对象中启动此函数。因此,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()