首页 > 解决方案 > python multiprocessing.Pool join() 函数超时?

问题描述

我正在运行一个 I/O 密集型程序,方法是使用 multithreading.Pool 库将其拆分为多个进程。当我在 Python 3.6 上的 Jupiter 中运行代码时,我没有遇到任何问题。

但是,当我在 Django 服务器上运行完全相同的代码时,有时线程根本不会加入。这与 Jupiter notebook 的输入相同。我知道线程/进程已完成执行,因为我在每个线程的开头和结尾都有打印语句,我可以看到所有线程都已完成,但它们根本不加入。

我的代码如下:

from multiprocessing import Pool


def run_thread(arg_one, arg_two):

    print ("Thread started")

    # Do stuff

    print ("Thread ended")

thread_list = []
pool = Pool(processes = number_of_processes, maxtasksperchild = 500)
for key, val in some_dict.items():

        # Run thread
        thread_list.append(pool.apply_async(run_thread, (arg_one, arg_two))

pool.close()
pool.join()
print ("All processed have joined.")

我环顾了其他一些答案,发现了类似的东西:

from multiprocessing import Pool


def run_thread(arg_one, arg_two):

    print ("Thread started")

    # Do stuff

    print ("Thread ended")

thread_list = []
pool = Pool(processes = number_of_processes, maxtasksperchild = 500)
for key, val in some_dict.items():

        # Run thread
        thread_list.append(pool.apply_async(run_thread, (arg_one, arg_two))


for t in thread_list:
    try:
        t.get(timeout = 5)
    except: 
        print ("Timeout occurred")

pool.close()
pool.join()
print ("All processed have joined.")

我想要的是,如果一个线程运行超过超时间隔,只需杀死它并继续前进。在上述解决方案中,我仍然必须等到所有线程都运行才能到达“所有进程已加入”的最终打印语句。

请原谅我对线程/进程的使用。我的意思是任何情况下的过程。

标签: pythonpython-3.xmultithreadingpython-multiprocessingpool

解决方案


推荐阅读