关于python线程池的四种实现方式

作者:伏逸 时间:2023-08-23 06:52:30 

python 线程池的四种实现方式

线程简述

 一个程序运行起来后,一定有一个执行代码的东西,这个东西就是线程;
 一般计算(CPU)密集型任务适合多进程,IO密集型任务适合多线程;
一个进程可拥有多个并行的(concurrent)线程,当中每一个线程,共享当前进程的资源

以下是对发现的几种多线程进行的汇总整理,均已测试运行 多线程实现的四种方式分别是:

multiprocessing下面有两种:

from multiprocessing.dummy import Pool as ThreadPool  # 线程池

from multiprocessing.pool import ThreadPool   # 线程池,用法无区别,唯一区别这个是线程池

另外两种:

from concurrent.futures import ThreadPoolExecutor  # python原生线程池,这个更主流

import threadpool  # 线程池,需要 pip install threadpool,很早之前的

方式1 multiprocessing.dummy Pool()

  • 非阻塞方法

multiprocessing.dummy.Pool.apply_async() 和 multiprocessing.dummy.Pool.imap()
线程并发执行

  • 阻塞方法

multiprocessing.dummy.Pool.apply()和 multiprocessing.dummy.Pool.map()
线程顺序执行

from multiprocessing.dummy import Pool as Pool
import time

def func(msg):
   print('msg:', msg)
   time.sleep(2)
   print('end:')

pool = Pool(processes=3)
for i in range(1, 5):
   msg = 'hello %d' % (i)
   pool.apply_async(func, (msg,))  # 非阻塞,子线程有返回值
   # pool.apply(func,(msg,))       # 阻塞,apply()源自内建函数,用于间接的调用函数,并且按位置把元祖或字典作为参数传入。子线程无返回值
   # pool.imap(func,[msg,])        # 非阻塞, 注意与apply传的参数的区别 无返回值
   # pool.map(func, [msg, ])       # 阻塞 子线程无返回值

print('Mark~~~~~~~~~~~~~~~')
pool.close()
pool.join()  # 调用join之前,先调用close函数,否则会出错。执行完close后不会有新的进程加入到pool,join函数等待所有子进程结束
print('sub-process done')

运行结果:

关于python线程池的四种实现方式

方式2:multiprocessing.pool ThreadPool Threading()

from multiprocessing.pool import ThreadPool   # 线程池,用法无区别,唯一区别这个是线程池
from multiprocessing.dummy import Pool as ThreadPool  # 线程池
import os
import time

print("hi outside of main()")

def hello(x):
   print("inside hello()")
   print("Proccess id: %s" %(os.getpid()))
   time.sleep(3)
   return x*x

if __name__ == "__main__":
   p = ThreadPool(5)
   pool_output = p.map(hello, range(3))
   print(pool_output)

运行结果:

关于python线程池的四种实现方式

方式3:主流ThreadPoolExecutor

from concurrent.futures import ThreadPoolExecutor
import threading
import time

# 定义一个准备作为线程任务的函数
def action(max):
   my_sum = 0
   for i in range(max):
       print(threading.current_thread().name + '  ' + str(i))
       my_sum += i
   return my_sum
# 创建一个包含2条线程的线程池
pool = ThreadPoolExecutor(max_workers=2)
# 向线程池提交一个task, 20会作为action()函数的参数
future1 = pool.submit(action, 20)
# 向线程池再提交一个task, 30会作为action()函数的参数
future2 = pool.submit(action, 30)
# 判断future1代表的任务是否结束
print(future1.done())
time.sleep(3)
# 判断future2代表的任务是否结束
print(future2.done())
# 查看future1代表的任务返回的结果
print(future1.result())
# 查看future2代表的任务返回的结果
print(future2.result())
# 关闭线程池
pool.shutdown()

运行结果:

关于python线程池的四种实现方式

方式4:threadpool

需要 pip install threadpool

import threadpool

def hello(m, n, o):
   """"""
   print("m = %s, n = %s, o = %s" % (m, n, o))

if __name__ == '__main__':
   # 方法1
   # lst_vars_1 = ['1', '2', '3']
   # lst_vars_2 = ['4', '5', '6']
   # func_var = [(lst_vars_1, None), (lst_vars_2, None)]
   # 方法2
   dict_vars_1 = {'m': '1', 'n': '2', 'o': '3'}
   dict_vars_2 = {'m': '4', 'n': '5', 'o': '6'}
   func_var = [(None, dict_vars_1), (None, dict_vars_2)]
   # 定义了一个线程池,表示最多可以创建poolsize这么多线程
   pool = threadpool.ThreadPool(2)
   # 调用makeRequests创建了要开启多线程的函数,以及函数相关参数和回调函数,其中回调函数可以不写
   requests = threadpool.makeRequests(hello, func_var)
   [pool.putRequest(req) for req in requests]   # 将所有要运行多线程的请求扔进线程池
   pool.wait()   # 等待所有线程完成工作后退出

"""
[pool.putRequest(req) for req in requests]等同于
for req in requests:  
pool.putRequest(req)
"""

运行结果:

关于python线程池的四种实现方式

来源:https://blog.csdn.net/ye__mo/article/details/123664568

标签:python,线程池
0
投稿

猜你喜欢

  • python 基于selenium实现鼠标拖拽功能

    2022-10-30 17:03:07
  • 在Python中使用matplotlib模块绘制数据图的示例

    2023-08-01 01:39:45
  • js判断某个字符出现的次数的简单实例

    2024-04-16 10:33:24
  • python实现绘制树枝简单示例

    2022-05-05 23:02:25
  • MySQL实时监控工具orztop的使用介绍

    2024-01-13 18:15:17
  • 用Python制作一个文件加密器

    2023-01-16 02:41:05
  • mysql安装图解 mysql图文安装教程(详细说明)

    2024-01-28 08:37:50
  • python2.7删除文件夹和删除文件代码实例

    2023-06-02 14:41:17
  • 深入探究Go语言从反射到元编程的实践与探讨

    2024-05-22 10:28:50
  • python如何给内存和cpu使用量设置限制

    2021-03-04 00:43:00
  • Python可执行文件反编译教程(exe转py)

    2022-05-07 19:37:11
  • Python装饰器decorator用法实例

    2023-02-06 23:26:43
  • hmac模块生成加入了密钥的消息摘要详解

    2023-05-17 09:26:46
  • Python简单实现的代理服务器端口映射功能示例

    2022-09-10 07:52:54
  • 关于人物角色设计讨论

    2008-10-16 13:47:00
  • Access创建一个简单MIS多媒体管理系统

    2008-10-13 12:31:00
  • vue2.0父子组件间通信的实现方法

    2024-04-28 09:20:16
  • windows安装python超详细图文教程

    2023-08-01 15:19:32
  • javascript解锁前端密码框常见功能做法

    2024-04-16 10:36:33
  • 新年快乐! python实现绚烂的烟花绽放效果

    2022-01-15 13:18:00
  • asp之家 网络编程 m.aspxhome.com