python2与python3 线程池使用

python2与python3线程池使用:

一 python2 (已经少用)

 1、安装
    pip install threadpool   
 2 、使用介绍
(1)引入threadpool模块
(2)定义线程任务函数   
(3)创建线程 池threadpool.ThreadPool()   
(4)创建需要线程池处理的任务即threadpool.makeRequests()   
(5)将创建的多个任务put到线程池中,threadpool.putRequest   
(6)等到所有任务处理完毕theadpool.pool()

import threadpool  
def ThreadFun(arg1,arg2):  
    pass  
def main():  
    object_list=[object1,object2,object3......,objectn]  # 需要处理的对象
    task_pool=threadpool.ThreadPool(8)  #8 是线程池中线程的个数  
    request_list=[]  #存放任务列表  
    #首先构造任务列表  
    for object  in object_list:  
        request_list.append(threadpool.makeRequests(ThreadFun,[((object, ), {})]))  

      #makeRequests存放的是要开启多线程的函数,以及函数相关参数和回调函数,其中回调函数可以不写(默认是无),将每  个任务放到线程池中,等待线程池中线程各自读取任务。  
    map(task_pool.putRequest,request_list)  
    #等待所有任务处理完成,则返回,如果没有处理完,则一直阻塞  
    task_pool.poll()  
if __name__=="__main__":  
    main()

二  python3 

 concurrent.futures  Executor挺供2个子类
 ThreadPoolExecutor 用于创建线程池
 ProcessPoolExecutor 用于创建进程池

 使用线程池来执行线程任务的步骤如下:

1调用 ThreadPoolExecutor 类的构造器创建一个线程池。
   # 创建一个包含2条线程的线程池
   pool = ThreadPoolExecutor(max_workers=2)

2 定义一个普通函数作为线程任务,调用 ThreadPoolExecutor 对象的 submit() 方法来提交线程任务。
   # 向线程池提交一个task, 50会作为action()任务函数的参数
   future = pool.submit(action, 50)
3 调用 ThreadPoolExecutor 对象的 shutdown() 方法来关闭线程池。
   # 判断future代表的任务是否结束
   print(future.done())
   #查看future代表的任务返回的结果
   print(future.result())
   # 关闭线程池
   pool.shutdown()
4 Future 的 add_done_callback() 方法来添加回调函数,该回调函数形如 fn(future)
  future1.add_done_callback(get_result)(关闭之前调用)

5 由于线程池实现了上下文管理协议(Context Manage Protocol),因此,程序可以使用 with 语句来管理线程池,这样即可避免手动关闭线程池,

扫描二维码关注公众号,回复: 12837870 查看本文章

# 创建一个包含4条线程的线程池
with ThreadPoolExecutor(max_workers=4) as pool:
    # 使用线程执行map计算
    # 后面元组有3个元素,因此程序启动3条线程来执行action任务函数
    results = pool.map(action, (50, 100, 150))
    print('--------------')
    for r in results:
        print r
map() 方法来启动线程,并收集线程的执行结果,不仅具有代码简单的优点,而且虽然程序会以并发方式来执行 action() 函数,但最后收集的 action() 函数的执行结果,依然与传入参数的结果保持一致。也就是说,上面 results 的第一个元素是 action(50) 的结果,第二个元素是 action(100) 的结果,第三个元素是 action(150) 的结果。线程池的 map() 方法会为 iterables 的每个元素启动一个线程,以并发方式来执行 func 函数。这种方式相当于启动 len(iterables) 个线程,井收集每个线程的执行结果


优点:

线程池可以有效地控制系统中并发线程的数量。
当系统中包含有大量的并发线程时,会导致系统性能急剧下降,甚至导致 Python 解释器崩溃,而线程池的最大线程数参数可以控制系统中并发线程的数量不超过此数
# https://www.cnblogs.com/scios/p/8651758.html
# https://blog.csdn.net/qq_36387683/

1、不能无限的开进程和线程,最常用的就是开进程池,开线程池。
2、其中回调函数非常重要,回调函数其实可以作为一种编程思想,函数式编程。谁好了谁就去执行。
3、只要你用并发,就会有锁的问题,但是你不能一直去自己加锁吧,那么我们就用QUEUE,这样还解决了自动加锁的问题。
4、由Queue延伸出的一个点也非常重要的概念,以后写程序也会用到这个思想,就是生产者与消费者问题。

猜你喜欢

转载自blog.csdn.net/weixin_42322206/article/details/100167935
今日推荐