Pythoh—7.2、线程池

概念简介

场景:进程中的线程在执行完成后就会销毁,下次执行任务时再次创建;线程的频繁创建涉及和操作系统的交互,有一定的时间和资源成本,线程池应用而生;

concurrent.futures模块
Executor类
ProcessPoolExecutor类
ThreadPoolExecutor类

Python 官方文档:https://docs.python.org/zh-cn/3/library/concurrent.futures.html?

代码实现

显示多线程

  • 代码实现
import time
from datetime import datetime
import threading

list = ["aa", "bb", "cc", "dd", "ee", "ff", "gg", "hh", "ii", "jj", "kk"]
lock = threading.Lock()

def deleteElement():
    global list
    while True:
        lock.acquire()
        if not list:
            lock.release()
            break
        else:
            ele = list.pop()
            print("{}-->{}-->{}".format(threading.current_thread().name,datetime.now(), ele))
            lock.release()
        time.sleep(1)


if __name__ == "__main__":
    task_a = threading.Thread(target=deleteElement, name="task-A")
    task_b = threading.Thread(target=deleteElement, name="task-B")
    task_a.start()
    task_b.start()
    task_a.join()
    task_b.join()
    print("mainThread现场执行完成")

注意:该代码中当列表为空退出时,需要同时释放 lock,否则将陷入死锁状态;

线程池引入

  • 方式一
import time
from datetime import datetime
import threading
from concurrent.futures import ThreadPoolExecutor

list = ["aa", "bb", "cc", "dd", "ee", "ff", "gg", "hh", "ii", "jj", "kk"]


def outputList(ele):
    print("{}-->{}-->{}".format(threading.current_thread().name, datetime.now(), ele))
    time.sleep(1)


if __name__ == "__main__":
    pool = ThreadPoolExecutor(max_workers=3, thread_name_prefix='task')
    for x in list:
        future = pool.submit(outputList, x)
    future.result()
    print("mainThread现场执行完成")

说明:此处的 future.result() 阻塞式的获取结果,可以确保主线程的内容最后执行;

  • 方式二

结果获取

from concurrent.futures import as_completed

    for o in as_completed(future_list):
        o.result()

回调函数

实现非阻塞式的结果获取

================================ over ========================================

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值