# -*- encoding: utf-8 -*-
import os
import subprocess
from time import time
'''
第36条: 用subprocess模块来管理子进程
关键:
1 并发
含义: 轮流执行程序的方式
2 并行
含义: 同一时间执行多个程序
3 并发与并行的区别
并发速度要比并行要慢
4 运行子进程的方式
subprocess模块: 最简单的子进程管理模块,可管理输入流和输出流
特点: 子进程会独立于父进程运行
父进程: 是python的解释器
可以给communicate传入timeout参数,避免死锁
参考:
Effectiv Python 编写高质量Python代码的59个有效方法
'''
def useSubprocess():
proc = subprocess.Popen(
['echo', 'I like python!'],
stdout=subprocess.PIPE
)
out, err = proc.communicate()
result = out.decode("utf-8")
print result
def getSubprocessStatus():
proc = subprocess.Popen(
['sleep', '0.3']
)
while proc.poll() is None:
print "Working..."
print "Exit status: {status}".format(
status=proc.poll()
)
def runSleep(period):
proc = subprocess.Popen(
['sleep', str(period)]
)
return proc
def runMultipleSubprocess():
start = time()
processes = []
for value in range(10):
proc = runSleep(0.1)
processes.append(proc)
for proc in processes:
proc.communicate()
end = time()
print "Cost {value} seconds".format(
value=end - start
)
def runOpenssl(data):
env = os.environ.copy()
# env['password'] = b'\xe24U\n\xdOQ135\x11'
env['password'] = 'mypassword'
proc = subprocess.Popen(
['openssl', 'enc', '-des3', '-pass', 'env:password'],
env=env,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE
)
proc.stdin.write(data)
'''
确保子进程获取输出
'''
proc.stdin.flush()
return proc
def writeData():
procs = []
for value in range(3):
data = os.urandom(10)
proc = runOpenssl(data)
procs.append(proc)
for proc in procs:
out, err = proc.communicate()
print out[-10:]
def process():
useSubprocess()
getSubprocessStatus()
runMultipleSubprocess()
writeData()
if __name__ == "__main__":
process()
Effective Python 读书笔记: 第36条: 用subprocess模块来管理子进程
猜你喜欢
转载自blog.csdn.net/qingyuanluofeng/article/details/88941188
今日推荐
周排行