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=True
和resp.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()
我想要 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=True
和resp.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()