Python多处理池与多处理ThreadPool

Ahm*_*med 5 python multithreading multiprocessing

我有一个图像路径列表,我想在进程或线程之间划分,以便每个进程处理列表的某些部分.处理包括从磁盘加载图像,进行一些计算并返回结果.我正在使用Python 2.7multiprocessing.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
Run Code Online (Sandbox Code Playgroud)

我面临的问题是,当我在我的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 
Run Code Online (Sandbox Code Playgroud)

我尝试过使用,multiprocessing.pool.ThreadPool而不是同时启动Workers.
我知道Windows上的多处理是如何工作的,我们必须放置一个main guard来保护我们的代码不会产生无限的进程.我的问题是我使用FASTCGI在IIS上托管我的脚本,我的脚本不是主要的,它由FastCGI进程运行(有一个wfastcgi.py脚本负责).现在wfastcgi.py中有一个主要的守卫,日志表明我没有创建无限的进程.

现在我想知道多处理池不能同时创建工作线程的原因究竟是什么,我真的很感激任何帮助.

编辑1:这是我的初始化器功能

def Initializer(classifier):
    global indexing_classifier
    logger.info('Worker started')
    indexing_classifier=classifier
Run Code Online (Sandbox Code Playgroud)

小智 0

我在尝试在 cgi/wsgi 下运行多重处理时遇到了很多问题,它在本地工作正常,但在真正的网络服务器上却不行......最终它不兼容。如果您需要进行多处理,请将异步作业发送到 Celery 之类的地方。