【python】Threadpool线程池任务终止简单示例

摘要:
需求加入我们需要处理一串个位数(0~9),奇数时需要循环打印它;偶数则等待对应时长并完成所有任务;0则是错误,但不需要终止任务,可以自定义一些处理。关键点定义func函数处理需求callback处理返回结果,只有偶数和0返回;奇数会一直执行;要控制线程池状态,则需要针对偶数和0时抛出异常,并捕获异常处理。
需求

加入我们需要处理一串个位数(0~9),奇数时需要循环打印它;偶数则等待对应时长并完成所有任务;0则是错误,但不需要终止任务,可以自定义一些处理。

关键点

定义func函数处理需求

callback处理返回结果,只有偶数和0返回;奇数会一直执行;要控制线程池状态,则需要针对偶数和0时抛出异常,并捕获异常处理。

threadpool定义线程池并发

实现
# -*- coding: utf-8 -*-
from threadpool import makeRequests, ThreadPool
import time
from multiprocessing import Process

异常定义和特殊值(0)定义

class Finish(SyntaxWarning):
pass

class PauseInfo(SyntaxWarning):
pass
pause_num = 0

func函数定义

0时返回False,其他偶数返回True

def func(para):
if para == pause_num:
print('start for %d and wait %ds' % (para, 4))
time.sleep(4)
print('error bcs ',para)
return False
if para % 2 == 0:
print('start for %d and wait %ds' % (para, para))
time.sleep(para)
print('stop for', para)
return True
while True:
print('continue for', para)
time.sleep(para)

callback定义

def callback(request, result):
if result:
raise Finish
else:
raise PauseInfo

线程池处理

Finish标识任务完成,使用sys.exit退出线程池处理;

def main_thread(paras):
pool = ThreadPool(10)
requests = makeRequests(callable_=func, args_list=paras, callback=callback)
[pool.putRequest(req) for req in requests]
while True:
try:
pool.wait()
except Finish as e:
sys.exit(0)
except PauseInfo as e:
print('Pause bcs %d but will continue' % pause_num)
except Exception as e:
print('Unknown error so will quit')
sys.exit(1)

主函数起一个测试进程

if __name__ == '__main__':
while True:
s = input('Input number list to test and any other word to quit ')
paras = []
for para in s:
if para.isnumeric():
paras.append(int(para))
else:
break
try:
thread_test = Process(target=main_thread, args=(paras,))
thread_test.start()
thread_test.join(timeout=20)
except TimeoutError as e:
print('task timeout')
except Exception as e:
print('unknow error:',e)
 结果验证 

处理108,看打印可以看到,1被循环处理,0处理的时候报错;8处理完毕则任务结束

Input number list to test and any other word to quit
108
continue for 1
start for 0 and wait 4s
start for 8 and wait 8s
continue for 1
continue for 1
continue for 1
error bcs 0
continue for 1
Pause bcs 0 but will continue
continue for 1
continue for 1
continue for 1
continue for 1
stop for 8
Input number list to test and any other word to quit

免责声明:文章转载自《【python】Threadpool线程池任务终止简单示例》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇IDEA快捷键(未使用)c# winform 智能模糊匹配 输入框下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Maya Max python PySide集成 shiboken版本对应关系

  Maya_Max _python_PySide集成_shiboken版本对应关系1.如何查看 Maya Max 集成的 Python版本:Maya:在 Maya 的安装目录下的 bin 文件夹中找到 mayapy.exe,双击运行就可以看到 Python 版本。 Max(2017及其以上)  :在 Max 的安装目录下找到 3dsmaxpy.exe,双...

一种基于Python Pika库的RabbitMQ Client简单封装

代码 参考 注意 代码 Github地址:https://github.com/HanseyLee/RabbitMQClient #!/usr/bin/python # -*- coding:utf-8 -*- import pika import hashlib import json def getMd5(input_str): """...

Python的变量

目标 变量的引用 可变和不可变类型 局部变量和全局变量 01. 变量的引用 变量 和 数据 都是保存在 内存 中的 在 Python 中 函数 的 参数传递 以及 返回值 都是靠 引用 传递的 1.1 引用的概念 在 Python 中 变量 和 数据 是分开存储的 数据 保存在内存中的一个位置 变量 中保存着数据在内存中的地址 变量 中 记录数据...

android实现高性能,高并发,可延时线程池管理

android实现高性能,高并发,可延时线程池管理 为什么要使用线程池?  1.)new Thread()的缺点 每次new Thread()耗费性能 调用new Thread()创建的线程缺乏管理,被称为野线程,而且可以无限制创建,之间相互竞争,会导致过多占用系统资源导致系统瘫痪。 不利于扩展,比如如定时执行、定期执行、线程中断     2.)采用线...

Python thread & process

线程 点击查看 <- 进程 点击查看 <- 线程与进程的区别 线程共享内部空间;进程内存空间独立 同一个进程的线程之间可以直接交流;两个进程之间想通信必须通过一个中间代理 创建新线程很简单,占用资源较少;创建新进程是对父进程的克隆,会占用很多资源 一个线程可以控制和操作同一进程里的其他线程;但是进程只能操作子进程 修改父线程可能会影响到进程下...

Python多进程与多线程

1、基本概念 2、多线程内容方法 3、多进程内容方法 1、基本概念 1.1 线程 1.1.1 什么是线程 线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流, 一个进程中可以并发多个线程,每条线程并行执行不同的任务。A thread is an execution context,...