码迷,mamicode.com
首页 > 编程语言 > 详细

通过threadpool初试多线程

时间:2018-08-29 01:18:30      阅读:166      评论:0      收藏:0      [点我收藏+]

标签:async   安装   取消   需要   star   thread   import   put   return   

import  threadpool,os    #threadpool需要pip安装
def foo(i):
print("son process %d %s"%(i,os.getpid()))
return i
def back(req,a): #俩个参数,一个是运行函数foo的返回值,还有输入一个request对象否则会报错
print(a)
if __name__=="__main__":
pool=threadpool.ThreadPool(5) #实例化空壳线程
lst=list(i for i in range(20))
reqs=threadpool.makeRequests(foo,lst,back) #传入参数lst需要是一个集合列表,对比多进程,不需要迭代了
for req in reqs:
pool.putRequest(req) #将request对象传入线程池
pool.wait() #相当于join()
print("end")
相比较于multiprocessing模块实现的多进程池,threadpool在实例化时候变化较大,三个接口:传入方法,传入参数,回调函数都有变化(线程池此处不是实例化线程,而是实例化一个requests对象集合。而进程池则在这个传参的时候就实例化线程了)。
可以看到,传入方法和传入函数,已经取消了关键字func和args,我们直接填入传入对象名即可,其次,传入参数变成了一个集合形式。而在进程池中,我们通过迭代给每一条线程传入不同的参数(仅以简单的i+=1作传入)
回调函数back需要俩个传入参数一个是requests对象,另一个是线程方法返回值,线程若是无返回值,则为None。若这里是进程池的话则只要接受返回值即可。所以一定要注意传入一个requests对象,否则会报错。
整个实例线程的步骤:
通过thread.makeRequests()创建requests对象,因为传入参数是个集合,所以创建的requests也是一个集合形式,通过一个迭代,将requests集合中的对象通过putRequest放入线程池运行,不用这一步类似于进程
池里的apply_async()和多进程中的start()。

通过threadpool初试多线程

标签:async   安装   取消   需要   star   thread   import   put   return   

原文地址:https://www.cnblogs.com/rookieboy/p/9551567.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!