写点什么

python 小知识 - 并发编程(1)

作者:AIWeker
  • 2022-11-05
    福建
  • 本文字数:1681 字

    阅读完需:约 6 分钟

python小知识-并发编程(1)

1. 并发基础概念

可以说,任何一种高级语言都会涉及到并发编程;我们都能说出并发的最大好处:可以提高程序的执行的效率;


并发简单的说就是利用多个资源同时执行多个小的任务,以提供大的任务的执行耗时; 这和分布式计算有点类似,分布式也是一种并发,只不过可利用的资源不只是单机的资源,而是有网络连接的计算机集群,当然这就增加了机器之间网络传输的开销,同时要处理更多有传输异常导致的异常容错处理机制。


并发通常会涉及到两个概念:线程和进程;


线程和进程有什么区别?划重点


  • 首先,进程(Process)是操作系统中最小资源管理单元,一个进程拥有独立的代码、数据和内存空间,是应用程序启动的一个实例;你只要在系统中执行一个程序(比如 py 代码),操作系统都会分配相应的资源来执行,执行完成会回收资源, 如果进程使用资源威胁到整个操作系统(比如内存飙升到 99%),操作系统会强杀它。也就是资源是收操作系统控制的。

  • 其次,进程下面允许有多个任务执行单元,这个任务执行单元就是线程(thread);同时线程有不同的状态(如创建,可运行,运行中,阻塞,死亡)。线程的状态控制也是由操作系统控制。

  • 当然还有一个协程的概念;进程和线程的资源控制是操作系统的分配,对于单核 cpu 来说,多个线程轮流的获取的 cpu 的使用权,达到并发的目的。协程的一个特点是资源是控制权在于设计者手上,协程在线程下面,也是并发编程的一个组成部分。


从上面的说明,我们可以总结下:


  • 进程下面有线程,线程下面有协程

  • 进程和进程之前的资源是独立的

  • 而同一个进程下的多个线程是共享资源,比如数据和内存空间等

  • 同时线程共享同一个资源,多个线程同时改变资源时,就会出现不一致性,这个时候考虑,独占资源


通常情况下,分布式计算都是多个进程的方式,就如上面总结的,进程之间资源是独立的,就会有一个共享资源的机制来负责进程之间数据的共享和传递(通常由 master 类的角色完成),这个在 python 多进程并行处理会涉及,区别是如何实现共享数据的处理。


我觉得,理解上面的基础概念是非常重要的,它们是并发编程的底层逻辑,是所有并发编程的基础。

2. 如何并发编程

用一个 python 的多线程的方式来说明如何并发编程?


from concurrent import futuresfrom time import sleep, strftime
def download_resource(file): sleep(1) print(strftime('[%H:%M:%S]'), ' ', 'download done file = {} '.format(file)) return file def run(files): workers = min(3, len(files)) with futures.ThreadPoolExecutor(workers) as executor: res = executor.map(download_resource, sorted(files)) return res files = ['{}.png'.format(i) for i in range(10)]res = run(files)
print('='*10, 'return information')for i in res: print(i)# [22:59:24][22:59:24] download done file = 0.png # [22:59:24] download done file = 2.png # download done file = 1.png # [22:59:25][22:59:25][22:59:25] download done file = 4.png # download done file = 3.png # download done file = 5.png # [22:59:26][22:59:26][22:59:26] download done file = 8.png # download done file = 6.png download done file = 7.png
# [22:59:27] download done file = 9.png # ========== return information# 0.png# 1.png# 2.png# 3.png# 4.png# 5.png# 6.png# 7.png# 8.png# 9.png
复制代码


python 中的 concurrent.futurest 提供了 ThreadPoolExecutor 线程池来创建线程池


  • 通过 map 把每个任务分配给执行函数执行

  • 并返回结果

  • with 来管理线程池的关闭


从上面例子,我们需要知道:


  • 并发编程的关键是编写一个任务的处理逻辑

  • 更重要的是如何将一个大任务拆分从小任务,比如前面例子中的 files 列表大任务,每个列表中的值就是一个小任务。


并发编程的关键:拆分任务,发起线程或者进程执行小任务,合并小任务结果大任务返回结果(如果需要返回任务的情况)。


希望今天的分享对你有帮助。


接下来的部分,我们将来了解 python 并发的特性,以及线程和多进程开发,敬请期待。

发布于: 刚刚阅读数: 3
用户头像

AIWeker

关注

InfoQ签约作者 / 公众号:人工智能微客 2019-11-21 加入

人工智能微客(aiweker)长期跟踪和分享人工智能前沿技术、应用、领域知识,不定期的发布相关产品和应用,欢迎关注和转发

评论

发布
暂无评论
python小知识-并发编程(1)_Python_AIWeker_InfoQ写作社区