Python 多处理池与多处理线程池

标签 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

我面临的问题是,当我在 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/

相关文章:

python - 通过 multiprocessing.Queue 传递 numpy 数组

python - Django REST 框架 : HTML render Generic APIView

python - 使用 SIFT OpenCV 处理大图像时出错

python - 想要将旧的 6502 源代码 HEX 行转换为 .byte $00 行

python - cross_val_score 返回每个类的准确度

java - ThreadInfo 类提供的信息是否比 JVMTI 提供的信息更多?

java - 如何优化 Tomcat 上运行的 Java 进程

c++ - 在 C++ 中使用 rand() 或 std::random_device 生成安全随机数

python - 如何在进程之间共享 pandas DataFrame 对象?

python - 正确实现 Python 多处理