Python 线程池——个人总结,不喜勿喷

有bug,请在评论区留下你得真言,谢谢

concurrent.futures 包含线程池和进程池,目前只记录线程池 ThreadPoolExecutor的使用

小二,上代码~

from concurrent.futures import ThreadPoolExecutor
import threading
import time

def test(i):
    print('threading name is %s, %s, %s' % (threading.current_thread().name, i, i+1))
    time.sleep(1)
    return 'finished'

if __name__ == "__main__":
    pool = ThreadPoolExecutor(max_workers=4, thread_name_prefix='test_')
    list_t = []
    for i in range(10):
        future = pool.submit(test, i)
        list_t.append(future)
    pool.shutdown(wait=True)

1.创建线程池ThreadPoolExecutor,max_workers:线程池的最大容量;thread_name_prefix:线程名称前缀,打印线程名称可查看

2.创建10个任务,给线程池执行,最大容量设置为4,所以只会同时执行4个任务

submit,执行任务,第一个参数test指定执行任务的函数,第二个参数指定给函数的参数

执行任务的函数,return,用于查看任务的执行结果

3.经过测试,当首次创建线程池时,是没有线程生成的,而是每提交一个任务给线程池,则会生成一个线程

生成的线程数=min(线程池容量(4),期望的任务数range(10))

线程池的线程执行完任务,不会被杀死,而是空闲状态,等待下个任务进来

4.pool.shutdown(),关闭线程池,结束线程,如果是想等所有任务完成,再关闭线程池,则设置pool.shutdown(wait=True)

from concurrent.futures import ThreadPoolExecutor
import threading
import time

def test(i):
    print('threading name is %s, %s, %s' % (threading.current_thread().name, i, i+1))
    time.sleep(1)
    return 'finished'

if __name__ == "__main__":
    pool = ThreadPoolExecutor(max_workers=4, thread_name_prefix='test_')
    list_t = []
    for i in range(10):
        future = pool.submit(test, i)
        list_t.append(future)
        print(future.done())
    pool.shutdown(wait=True)

5.查看任务是否完成,future.done(),返回值是bool

 

from concurrent.futures import ThreadPoolExecutor
import threading
import time

def test(i):
    print('threading name is %s, %s, %s' % (threading.current_thread().name, i, i+1))
    time.sleep(1)
    return 'finished'

def done_callback(future):
    print(future.result())
    print('it is stop %s' % threading.current_thread().name)

if __name__ == "__main__":
    pool = ThreadPoolExecutor(max_workers=4, thread_name_prefix='test_')
    list_t = []
    for i in range(10):
        future = pool.submit(test, i)
        list_t.append(future)
        # time.sleep(1.5)
        future.add_done_callback(done_callback)
    for t in list_t:
        print(t.result())
    print(threading.active_count())
    pool.shutdown(wait=True)
    print(threading.active_count())
    

异步回调,输出任务执行结果,future.add_done_callback(done_callback),done_callback()为回调函数,即任务执行完或者

退出就调用这个函数

注意:回调函数必须存在一个参数,代表调用函数的任务对象future,可以通过这个对象查看执行结果,future.result()

大家可能注意到,我这里注释了一行代码,sleep(),有这样两种情况:

       1) 存在这行代码,执行回调函数,打印线程,是主线程

       2) 不存在这行代码,执行回调函数,打印线程,是当前执行任务的线程

       3) 总结:有个猜测,回调方法,是线程执行完任务就调用这个方法,如果sleep()阻塞,则这个future脱离了这个线程,只是一个对象,对于这个调用,变成了主线程执行,大家有知道的评论区留下,谢谢

同步输入任务执行结果,通过列表存储这些任务,调用result()获取执行结果

threading.active_count():查询当前线程数:生成的线程数=min(线程池容量(4),期望的任务数range(10)) + 1(1代表主线程),关闭线程池后,数量为1,只剩下主线程,代表关闭线程池,则实现线程被杀死

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值