我有一个图像路径列表,我想在进程或线程之间划分这些路径,以便每个进程处理列表的某些部分。处理包括从磁盘加载图像,进行一些计算并返回结果。我正在使用 Python 2.7 multiprocessing.Pool
下面是我如何创建工作进程
def ProcessParallel(classifier,path):
files=glob.glob(path+"\*.png")
files_sorted=sorted(files,key=lambda file_name:int(file_name.split('--')[1]))
p = multiprocessing.Pool(processes=4,initializer=Initializer,initargs=(classifier,))
data=p.map(LoadAndClassify, files_sorted)
return data
我面临的问题是,当我在 Intializer 函数中记录初始化时间时,我开始知道 Worker 不是并行初始化的,而是每个 worker 的初始化间隔为 5 秒,这是日志供引用
2016-08-08 12:38:32,043 - custom_logging - INFO - Worker started
2016-08-08 12:38:37,647 - custom_logging - INFO - Worker started
2016-08-08 12:38:43,187 - custom_logging - INFO - Worker started
2016-08-08 12:38:48,634 - custom_logging - INFO - Worker started
我尝试使用 multiprocessing.pool.ThreadPool
而不是同时启动 Workers。
我知道 Windows 上的多进程是如何工作的,我们必须放置一个 main guard
来保护我们的代码免于产生无限进程。我的问题是我使用 FASTCGI 在 IIS 上托管了我的脚本,而我的脚本不是 main ,它是由 FastCGI 进程运行的(有一个 wfastcgi.py 脚本负责)。现在 wfastcgi.py 中有一个主要守卫,日志表明我没有创建无限多的进程。
Now I want to know that what exactly is the reason behind multiprocessing Pool not creating worker threads simultaneously, I'll really appreciate any help.
编辑 1:这是我的初始化函数
def Initializer(classifier):
global indexing_classifier
logger.info('Worker started')
indexing_classifier=classifier
最佳答案
我在尝试在 cgi/wsgi 下运行多处理时遇到了很多问题,它在本地运行良好,但在真正的网络服务器上却不行……最终它只是不兼容。如果您需要进行多处理,则将异步作业发送到 Celery 之类的东西。
关于Python 多处理池与多处理线程池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38824636/