python有好几种实现线程池的方式,
注意选择一下,哪种是自己需要的。
最近用上ThreadPoolExecutor,
用来代替celery的方式。
主要是用在celery上的时间太少,
没有吃透,
还有,我们的应用没有复杂到那地步,
多开几个服务器,也可以实现线程池的扩展。
ThreadPoolExecutor主要有submit和map方式。
map就够用我们的场景了。
使用ThreadPoolExecutor时,需要注意的是map函数的参数是如何构造的。
(就是将cmd_run后面的参数,构造为有相同于进程池数量的参数列表!!!)
【就是参数个人为cmd_run要求的个数,但列表内的长度为进程池数量,利用率刚好】
data为每个函数的返回值。
注意,进程的退出,不到山穷水尽,不要用os.exit()这样的函数,
python可能无法正常完成数据操作及资源回收。
最好是利用函数的返回值自然退出线程,高端些~
from concurrent.futures import ThreadPoolExecutor
executor = ThreadPoolExecutor(max_workers=xxx)
for data in executor.map(cmd_run, subserver, [deploy_type] * sub_len, [cmd] * sub_len,
[current_user_set] * sub_len, [percent_value] * sub_len,
[app_name] * sub_len, [deployversion_id] * sub_len, [auto_deploy_id] * sub_len):
mylog.debug("cmd %s result is: " % cmd + str(data))
if not data:
return False