python - 当我们运行许多任务时,python 多处理池不起作用
问题描述
示例:我有一个带有 2 个线程的 CPU,所以我有 2 个工作人员使用此代码。
tasks = ['1.txt', '2.txt', '3.txt', '4.txt', '5.txt']
pool = multiprocessing.Pool()
pool.map(myfunc, tasks, chunksize=1)
pool.close()
pool.join()
如果我运行这个程序,它将首先处理“1.txt”和“2.txt”,然后当其中一个完成工作时,它将开始下一个文件。这意味着它一次只处理 2 个文件,对吧?
但是当我运行许多文件时,我发现了问题。(可能超过 100 多个文件)。程序不会等到 2 名工人中的一名完成工作,而是将工作分配给工人 3、4、5、6、7、8、9 等。
我该如何解决这个问题?
提前谢谢大家。
PS我使用Python 3.6。
解决方案
您可以指定池中的工作进程数,将其作为参数传递给multiprocessing.Pool()
.
例子:
import multiprocessing
import time
def myfunc(t):
print("{} starts".format(t))
time.sleep(1)
print("{} ends".format(t))
tasks = ['1.txt', '2.txt', '3.txt', '4.txt', '5.txt']
pool = multiprocessing.Pool(processes=2)
pool.map(myfunc, tasks, chunksize=1)
pool.close()
pool.join()
在我的机器上输出
1.txt starts
2.txt starts
1.txt ends
3.txt starts
2.txt ends
4.txt starts
3.txt ends
5.txt starts
4.txt ends
5.txt ends
虽然没有指定工作进程的数量,但我得到的是:
1.txt starts
2.txt starts
3.txt starts
4.txt starts
3.txt ends
1.txt ends
2.txt ends
4.txt ends
5.txt starts
5.txt ends
推荐阅读
- javascript - 如何让 css-loader 和 style-loader 正常工作以允许我将 CSS 文件与 Webpack 一起使用?
- python - Q: UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe3 in position 0: unexpected end of data
- swift - 在 SwiftUI 视图中插入非列表元素
- graphql - 困惑为什么 returnPartialData 在 Apollo Client 3 中没有字段策略的情况下工作
- selenium-chromedriver - 在 chrome94 上,硒无法定位元素
- python - 如何创建具有 msg 功能的 tkinter Python 聊天应用程序?
- javascript - 尝试在正则表达式掩码后添加字母单词
- excel - 迎接挑战?我无法调试此脚本
- tailwind-css - 如何将自定义填充权添加到顺风?
- html - 如何叠加两张图像但将其定位为看起来像一张?