如何在 Python 3 中使用带有多个参数的多重处理?

Rya*_*yan 6 python multiprocessing python-3.x

我有一个 for 循环,它会从一组 URL 中获取一个 URL 并访问该 URL 并执行其他一些操作,但它花费了很长时间,所以我想我可以通过一些多重处理来加速它,但我很挣扎这样做。

感谢您的帮助。

def accessAndSaveFiles(urlSet, user, verboseFlag):
    with multiprocessing.Pool(os.cpu_count()) as pool:
        pool.starmap(processURL, zip(itertools.repeat(urlSet), user, verboseFlag))

def processURL(url, user, verboseFlag):
    filePath = some_path

    img_data = requests.get(url, allow_redirects=True)
    open(filePath, 'wb').write(img_data.content)


def main():
    ...
    accessAndSaveFiles(urlSet, user, verboseFlag)
    ...
Run Code Online (Sandbox Code Playgroud)

我在“pool.starmap(processURL, zip(itertools.repeat(urlSet), user, verboseFlag))”行上收到错误,提示“TypeError: zip argument #3 must support iteration”。我不想迭代这个项目,我只想每次发送相同的值。

Ank*_*r S 8

假设 urlset 是一个可迭代的,你应该使用

pool.starmap(processURL, zip(urlSet, repeat(user), repeat(verboseFlag)))
Run Code Online (Sandbox Code Playgroud)

这是因为您想要迭代 urlset,但每个 processURL 实例具有相同的用户和 verboseFlag(因此,重复)

作为参考,您应该查看Python multiprocessing pool.map 的多个参数

迭代时 zip 的输出应该类似于

[('www.google.com','user1',True),('www.goodle.uk','user1',True),]
Run Code Online (Sandbox Code Playgroud)

为了pool.starmap理解它。