通过threadpool初试多线程
Posted rookieboy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过threadpool初试多线程相关的知识,希望对你有一定的参考价值。
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初试多线程的主要内容,如果未能解决你的问题,请参考以下文章