python实现线程池的小例子

发布时间:2020-03-31编辑:脚本学堂
分享一个python实例线程池的小例子,学习下python语言中线程池的实现方法,学习下实现思路,有需要的朋友参考下。

python线程池的实现代码。
例子:
 

复制代码 代码示例:

#!/bin/python
#site: www.jb200.com
#
import threading
import time
import signal
import os

class task_info(object):
    def __init__(self):
        self.func = None
        self.parm0 = None
        self.parm1 = None
        self.parm2 = None

class task_list(object):
    def __init__(self):
        self.tl = []
        self.mutex = threading.Lock()
        self.sem = threading.Semaphore(0)

    def append(self, ti):
        self.mutex.acquire()
        self.tl.append(ti)
        self.mutex.release()
        self.sem.release()

    def fetch(self):
        self.sem.acquire()
        self.mutex.acquire()
        ti = self.tl.pop(0)       
        self.mutex.release()
        return ti

class thrd(threading.Thread):
    def __init__(self, tl):
        threading.Thread.__init__(self)
        self.tl = tl

    def run(self):
        while True:
            tsk = self.tl.fetch()
            tsk.func(tsk.parm0, tsk.parm1, tsk.parm2)   

class thrd_pool(object):
    def __init__(self, thd_count, tl):
        self.thds = []

        for i in range(thd_count):
            self.thds.append(thrd(tl))

    def run(self):
        for thd in self.thds:
            thd.start()

def func(parm0=None, parm1=None, parm2=None):
    print 'count:%s, thrd_name:%s'%(str(parm0), threading.currentThread().getName())

def cleanup(signo, stkframe):
    print ('Oops! Got signal %s', signo)  

    os._exit(0)

if __name__ == '__main__':

    signal.signal(signal.SIGINT, cleanup)
    signal.signal(signal.SIGQUIT, cleanup)
    signal.signal(signal.SIGTERM, cleanup)

    tl = task_list()
    tp = thrd_pool(6, tl)
    tp.run()

    count = 0
    while True:

        ti = task_info()
        ti.parm0 = count
        ti.func = func
        tl.append(ti)
        count += 1

        time.sleep(2)
    pass

执行方式:pythonthrd;_pool.py
执行结果:
 

count:0,thrd;_name:Thread-1 count:1,thrd;_name:Thread-2 count:2,thrd;_name:Thread-3 count:3,thrd;_name:Thread-4 count:4,thrd;_name:Thread-5 count:5,thrd;_name:Thread-1 count:6,thrd;_name:Thread-6 count:7,thrd;_name:Thread-2 count:8,thrd;_name:Thread-3 count:9,thrd;_name:Thread-4 count:10,thrd;_name:Thread-5 count:11,thrd;_name:Thread-1 count:12,thrd;_name:Thread-6 count:13,thrd;_name:Thread-2 count:14,thrd;_name:Thread-3 ('Oops!Got;signal;;%s',15;)