python 线程池_python实现线程池的方法

本文实例讲述了python实现线程池的方法。分享给大家供大家参考。具体如下:

原理:建立一个任务队列,然多个线程都从这个任务队列中取出任务然后执行,当然任务队列要加锁,详细请看代码

文件名:thrd_pool.py 系统环境:ubuntu linux & python2.6

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

执行方式:python thrd_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)

希望本文所述对大家的Python程序设计有所帮助。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值