Python 多处理数组中的所有函数

Python Multiprocessing all Functions within an Array

我想要 Python 中的函数数组。 像这样:

def download(x,y):
      r = requests.get(x, allow_redirects=True)
      open(y, 'wb').write(r.content)

array = [download(url,filename),download(url2,filename2)]

现在我想使用多处理或多线程(取决于哪个更好)来同时 运行 所有这些。

但是函数的数量可能会增加,所以我正在努力 运行 多线程。

有什么建议吗?

多处理,像这样。

  • 这是使用进程池;对于网络 IO 绑定操作,您可以使用 multiprocessing.pool.ThreadPool() 代替 运行 单个进程。
  • 默认情况下,Pool() 为每个 CPU 生成一个工人。您可能希望向上或向下调整它。
  • 使用 requests 会话比直接使用 requests.get() 更有效(TCP、HTTP、TLS 开销)。
  • 你不见了resp.raise_for_status();这意味着您最终可以保存 404 或 500 响应,就好像一切正​​常一样。 (您现在可能希望添加一些异常处理;任何失败的作业都会向上传播以关闭池并终止其他作业。)
  • 使用stream=Trueresp.iter_content()将避免将内容缓冲到内存中。
  • imap_unordered() 是最快的高级池操作,但顾名思义,它会丢失作业的顺序。在这种情况下应该无关紧要。
  • 如果你有更多的工作,你可以使用 chunksize 参数优化一些池开销,这基本上意味着一个工人将被发送多个工作项目。
import multiprocessing
import requests

sess = requests.Session()


def download(job):
    url, filename = job
    resp = sess.get(url, allow_redirects=True, stream=True)
    resp.raise_for_status()
    with open(filename, "wb") as f:
        for chunk in resp.iter_content(524288):
            f.write(chunk)


def main():

    jobs = [
        (url, filename),
        (url2, filename2),
    ]

    with multiprocessing.Pool() as p:
        for _ in p.imap_unordered(download, jobs):
            pass


if __name__ == "__main__":
    main()