python多线程之限制同时运行的线程个数

# -*- coding: utf-8 -*-
from __future__ import unicode_literals,division

import random,time
import threading

__author__='坏小子'


class MyThreadPool():
    def __init__(self,fun,n=4):
        assert n>0
        self.n=n
        self.i=0
        
        self.fun=fun
        
        self.l=[]
        self.ev=threading.Event()
        self.ev.set()
        self.finished_ev=threading.Event()
        self.finished_ev.clear()
        self.i_lock=threading.Lock()
        self.ev_lock=threading.Lock()
    def put(self,x):
        self.l.append(x)
    def puts(self,l):
        for x in l:
            self.l.append(x)
    def start(self):
        if len(self.l)==0:
            return
        while self.l:
            x=self.l.pop(0)
            self.ev.wait()
            t=threading.Thread(target=self.fun, args=(x,))
            t_=threading.Thread(target=self.__start_a_thread, args=(t,))
            t_.start()
            self.i_lock.acquire()
            self.i+=1
            self.i_lock.release()
            if self.i>=self.n:
                self.ev_lock.acquire()
                self.ev.clear()
                self.ev_lock.release()
        self.__join()
        print 'thread pool finished'

    def __join(self):
        self.finished_ev.wait()

    def __start_a_thread(self,t):
        t.start()
        t.join()
        self.i_lock.acquire()
        self.i-=1
        if self.i<self.n:
            self.ev_lock.acquire()
            self.ev.set()
            self.ev_lock.release()
        self.i_lock.release()

        if len(self.l)==0:#如果这是最后一个任务
            self.finished_ev.set()


def test():
    rd=random.random
    
    def f(x):
        print x,'start'
        time.sleep(rd()*4)
        print x,'finished'
    
    l=range(10)
    
    tp=MyThreadPool(f,5)
    tp.put(l[0])
    tp.puts(l)
    tp.start()#然后程序会阻塞在这一句
    
    print 'all finished !'

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值