进程&线程(三):外部子进程subprocess、异步IO、协程、分布式进程
1、外部子进程subprocess
python之subprocess模块详解--小白博客 - 夜风2019 - 博客园
python subprocess模块 - lincappu - 博客园
之前所说子进程的代码实现都是在主进程内部的,然而很多时候,子进程都是一个外部进程,我们需要控制子进程的输入与输出。
subprocess模块使我们可以非常方便地启动一个外部子进程,然后控制其输入与输出。
例子
通过在Python脚本中写代码,来达到和命令行运行相同的效果(相当于另外开了一个线程):
nslookup www.python.org
代码:
import subprocess print('$ nslookup www.python.org') r=subprocess.call(['nslookup','www.python.org']) print('Exit Code',r)
如果进程还需要传入一些参数,可以通过communicate()方法输入。
2、异步IO、协程
目的是解决CPU与IO之间速度不匹配的问题。虽然多线程/多进程是解决方法之一,但是创建太多进程/线程,那么CPU就会花费较多时间用于进程切换。所以可以采用另一种方法异步IO——当代码需要执行一个耗时的IO时,它只发出IO指令而不等待IO结果,然后就去执行其他代码了。一段时间后,当IO返回结果时,再通知CPU进行处理。
我们按照普通代码的方式是无法写出异步IO模型的。
异步IO需要一个消息循环,在消息循环中,主线程不断重复“读取消息——处理消息”这一过程:
loop=get_event_loop() while True: event=loop.get_event() process_event(event)
3、分布式进程
学习自:
Process可以分布到多台机器上,而Thread只能分布到同一台机器上的多个CPU中。
multiprocessing模块支持多进程,其中的managers子模块支持把多进程分布到多台机器上。