python线程池控制
admin
2023-07-30 21:15:23
0

最近一个项目上使用线程池,设定处理项1W,10线程,但是需要检测线程进行状态。出现错误N次,就自动终止线程。实现如下:

线程池代码

ERRORCOUNT=0
IS_EXIT=True
class Worker(Thread):
    worker_count=0
    timeout=1
    def __init__(self, workQueue,resultQueue,**kwds):
        Thread.__init__(self,**kwds)
        self.id=Worker.worker_count
        Worker.worker_count+=1
        self.setDaemon(True)
        self.workQueue=workQueue
        self.resultQueue=resultQueue
        self.start()

    def run(self):
        #the get-some-work,do-some-work main loop of worker threads
        while IS_EXIT:
            try:
                callable,args,kwds=self.workQueue.get(timeout=Worker.timeout)
                res=callable(*args,**kwds)
                self.resultQueue.put(res)
            except Queue.Empty:
                break
            except:
                pass

class WorkerManager:
    def __init__(self, num_of_workers=10,timeout=2):
        self.workQueue=Queue.Queue()
        self.resultQueue=Queue.Queue()
        self.workers=[]
        self.timeout=timeout
        self._recruitThreads(num_of_workers)

    def _recruitThreads(self,num_of_workers):
        for i in range(num_of_workers):
            worker=Worker(self.workQueue,self.resultQueue)
            self.workers.append(worker)

    def wait_for_complete(self):
        #then,wait for each of them to terminate
        while len(self.workers):
            worker=self.workers.pop()
            worker.join(10)
            if worker.isAlive() and not self.workQueue.empty():
                self.workers.append(worker)

    def add_job(self,callable,*args,**kwds):
        self.workQueue.put((callable,args,kwds))

    def get_result(self,*args,**kwds):
        return self.resultQueue.get(*args,**kwds)

在WorkerManager中使用到一个全局变量IS_EXIT用来判断是否需要退出线程

调用线程代码

wm=WorkerManager(10)#10线程
for i in range(10000):
    wm.add_job(do_job)
wm.wait_for_complete()

具体工作代码

def do_job():
    global ERRORCOUNT
    global IS_EXIT
    try:
        do anything
    except:
        ERRORCOUNT+=1
            if ERRORCOUNT>5:
                IS_EXIT=False

此处使用了全局变量ERRORCOUNT统计错误数量,超过指定次数,则设置IS_EXIT=False通知线程停止执行。
至此基本上满足项目所需,但并不友好,应有更好的方式。

相关内容

热门资讯

500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
python绘图库Matplo... 本文简单介绍了Python绘图库Matplotlib的安装,简介如下: matplotlib是pyt...
Prometheus+Graf... 一,Prometheus概述 1,什么是Prometheus?Prometheus是最初在Sound...