python - 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.")
我想要的是,如果一个线程运行超过超时间隔,只需杀死它并继续前进。在上述解决方案中,我仍然必须等到所有线程都运行才能到达“所有进程已加入”的最终打印语句。
请原谅我对线程/进程的使用。我的意思是任何情况下的过程。
解决方案
推荐阅读
- swift - 有什么方法可以防止在一段时间后对变量进行更改?
- ios - UIKit 什么时候自动移除约束
- java - jdeps 在 fat jar 中使用 Java 11 和 JavaFX 失败
- java - 使用java spring boot jdbc模板执行oracle sql ddl statemenet后如何获得响应?
- react-native - 构建应用程序时反应原生意外令牌
- python-3.x - 如何根据公式为 LPP 设置纸浆中的 LpVariable 和目标函数?
- angular - 如何通过angular6中的组件访问fontawesome图标
- spring-boot - 我想在项目中保存凭据(OAuth2.0)。不在磁盘上。- 谷歌表格 API
- c++ - 使用 C++ API 在 Gurobi 中创建多维变量
- excel - 从 VBA 调用 FactSet 刷新