作者的笔记,介绍 Python 中的多进程.
本文由 @Hash 撰写,由 @Xecades 代为发布,并稍作更改.
欢迎在评论区讨论本文相关内容,@Hash 将会予以回复.
bash
涉及的知识点,主要包括 fork,source,exec 命令(毕竟都是 C 的 wrap,得懂点 C 才好挖深).
- shell 中运行任何外部命令,都会 fork 一个进程,然后 exec,
source
一个 shell 脚本会在当前进程下执行,exec
会将当前进程修改成新进程,退出时不会返回父进程,wait
用于进程同步,可以等待某个 pid,或者等待全部子进程. 作用范围可以是全局或者函数.
进程树可以通过 pstree 直观地查看.
1 |
|
另外,如果使用 sh(而不是 bash),或者 libc 而不是 glibc(比如 alpine 的 musl),则会顺序输出 1 - 10. 还不知道为什么.
python fork
把上面的代码翻译下来(只能在 Unix 下运行):
首先需要知道这几个封装的 API.(参数,返回值)
os.fork()
os.getpid()
os.getppid()
os._exit()
(退出子进程)os.wait()
,os.waitid()
(用于进程同步)
别的知识点包括进程状态,孤儿 / 僵尸进程,资源独立.
- 孤儿进程:主进程先结束,子进程的父进程变为 pid1(init),
- 僵尸进程:子进程先结束,但未正确退出,占用资源,
- 资源独立:fork 前的数据父子共享,fork 之后数据独立,进程间全局变量不共享.
1 | # 实际上这个是异步的,不过因为 python print 太快 |
这样的弊端:
- Windows 没有 fork,无法运行
- fork 的设计就很扯淡(我没认真学过,道听途说罢了)
- 总有廖雪峰会拿 Windows 没有 fork 来推荐 Mac(
python multiprocessing
博大精深,参见:
这里只记笔记,细节见外链.
基础
Pool p => p.join()
相当于 shell 里面的 wait
(Haskell 瞩目)
进程间通信
multiprocessing.Queue
Queue
类是一个近似 queue.Queue
的克隆.
1 | from multiprocessing import Process, Queue |
multiprocessing.Pipe
1 | from multiprocessing import Process, Pipe |
请注意,如果两个进程(或线程)同时尝试读取或写入管道的同一端,则管道中的数据可能会损坏.
当然,在不同进程中同时使用管道的不同端的情况下不存在损坏的风险.
进程锁
关于线程锁和进程锁,推荐这篇文章:
python线程锁和进程锁_S_o_l_o_n的博客-CSDN博客1 | from multiprocessing import Process, Lock |
此处多进程的锁不用于限制变量访问,而是同步 IO.
如果把锁去掉,输出会有奇效 w
共享状态
pass
本文作者:Hash
本文链接:https://blog.xecades.xyz/hide/multiprocessing.html
文章默认使用 CC BY-NC-SA 4.0 协议进行许可,使用时请注意遵守协议。
评论