今日综述
今天用了接近1天的时间,才搞定了Python中进程间的互相控制,包含主进程与子进程之间,子进程之间。着实花费了一番心力,说明自己的功底还是太浅。
记录一下今天的坑点,备忘
- 进程间可以共享的数据,是有要求的,比如用
mutiprocess.Process()
创建的进程对象,就不能作为参数直接传递给其他进程,否则报错TypeError: cannot pickle 'xxxxx' object
,但pid可以,确认了pid可行后,后面直接开了绿灯,一路畅通了
- 线程间的控制很复杂,网上有人说Python在设计中就是不允许线程间互相控制的(存疑?),但有人通过一些比较曲折的方式实现了并不太完美的效果,我觉得不是我想要的,放弃了
- 线程间是可以共享进程的内存变量的(包含函数及变量),这看起来似乎是很有助于设计监视线程(比如,在进程中单独创建一个子线程,用于监视其他线程的状态,并根据条件去控制),但在实际中使用时,却悲催的发现,尽管监视线程可以操作很多单独并行的任务,但在它操作期间却无法暂停其他线程,当然方法并不是没有,比如通过一个变量flag记录状态,但那不适用于顺序执行的目标任务。在这上面反反复复搜索方案、尝试方案,浪费了非常多的时间
- 最后确认了通过进程控制进程。这里又涉及两种方案
- 在主进程中创建两个子进程,p1中放置目标任务,p2中放置监视任务,但这样需要创建2个子进程,不是最优解
- 主进程中放置目标任务,在主进程中创建1个子进程去控制主进程,从资源消耗上来说是最优解,但却入了一个坑点,就是子进程必须创建在目标任务之前,否则程序将顺序执行,直到执行完目标任务,才轮到子进程start(),此时黄花菜都凉了
- 最终选择的是
multiprocess.Process()
配合psutil
,完成了进程间的互相控制
后记
学无止境,BUG无边。且行且长进吧!