python 的线程池

在python中,线程池一般通过threading和Queue来实现。这里只是说明一些原理。


举个例子:
原来学校旁边有个诊所,平时医生忙里忙外,一个人还能基本完成诊断工作。
这就是一般的单线程了。有十个人看病,你也只能等你前面的九个人看好了才轮到你。

某一天,出现了流感,诊所门口爆满!医生一个人实在忙不过来了。只好在诊所外面搭了九顶帐篷,添加了九位实习医生,用于分散人流,加快就诊速度。


用计算机的哲学来看,现在就是有十个cpu core在处理“忙不过来”的任务。

现在结构就很清晰了:
有1000个页面要抓取,现在创建了十个线程。这1000个页面不是平均分配的。这里采用的是多劳多得,少劳少得。
这里有一个很简单的例子:
import threading
import Queue

queue = Queue.Queue()

class Worker(threading.Thread):
    def __init__(self, queue):
        threading.Thread.__init__(self)
        self.queue = queue
        self.start()
    
    def run(self): 
        while True: 
            if self.queue.empty():
                break;
            caller, args = self.queue.get()
            caller(args)
            self.queue.task_done()


def do_somethinking(arg):
    pass

'''
here are 1000 pages need to analyze
'''
def fetch():
   for i in xrange(1000):
       queue.put((do_something, arg))

### main ###
if __name__ == '__main__':
    # maybe some data
    fetch()
    
    #create the worker threads
    for i in xrange(10): 
        Worker(queue)

这里的Worker就是对应的医生,而这里的fetch就是病毒,专门然人感冒,不然就不会有人去看医生了。

不管你生不生病,医生就在那里。


但是Python的多线程是有争议的,效果并不能像C/C++这些语言那样。要利用多和CPU的优势,多用multiprocessing模块。

关于multiprocessing的讲解随后奉上。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值