进程&线程(三):外部子进程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、协程

异步IO 协程 - ShineLe - 博客园

目的是解决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、分布式进程

学习自:

Python之进程与线程 - 云--澈 - 博客园

分布式进程 - ShineLe - 博客园

Process可以分布到多台机器上,而Thread只能分布到同一台机器上的多个CPU中。

multiprocessing模块支持多进程,其中的managers子模块支持把多进程分布多台机器上。

 

posted @ 2021-04-22 16:29  ShineLe  阅读(388)  评论(0)    收藏  举报