Python多处理池与多处理ThreadPool

时间:2016-08-08 08:37:49

标签: python multithreading multiprocessing

我有一个图像路径列表,我想在进程或线程之间划分,以便每个进程处理列表的某些部分。处理包括从磁盘加载图像,进行一些计算并返回结果。我使用的是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

我面临的问题是,当我在我的初始化函数中记录初始化时间时,我发现工作者并没有并行初始化,而是每个工作者初始化的间隔为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而不是同时启动工作人员 我知道Windows上的多处理是如何工作的,我们必须放置一个main guard来保护我们的代码不会产生无限的进程。我的问题是我使用FASTCGI在IIS上托管我的脚本,我的脚本不是主要的,它由FastCGI进程运行(有' wfastcgi.py脚本这是负责的)。现在wfastcgi.py中有一个主要的守卫,日志表明我没有创建无限的进程。

  

现在我想知道背后的原因究竟是什么   多处理池不能同时创建工作线程,I ll   非常感谢任何帮助。

编辑1:这是我的初始化函数

def Initializer(classifier):
    global indexing_classifier
    logger.info('Worker started')
    indexing_classifier=classifier

1 个答案:

答案 0 :(得分:0)

我尝试在cgi / wsgi下运行多处理有很多问题,它在本地工作正常,但不适用于真正的网络服务器......最终它只是不兼容。如果您需要进行多处理,则将异步作业发送到像Celery这样的东西。