python学习笔记(十)——进程间通信
python 在进程间通信时有很多方式,比如使用Queue的消息队列,使用 pip的管道通信,share memory 共享内存或 semaphore 信号量等通信方式。
这里我们演示一下通过消息队列的方式进行进程间信息的传递。
from multiprocessing import Process,Queue
import time,random,os
def wrtie(qu): # 写入数据
print("child_process write:")
for i in ["a","b","c","d","end"]:
print("写入数据....%s"%i)
qu.put(i) # 消息入队
time.sleep(random.random())
print("数据写入完成")
def read(qu): # 读取数据
while qu.empty:
msg=qu.get()
if msg=="end":
print("读取结束")
break
print("读取数据 %s"%msg)
if __name__=="__main__":
qu=Queue(100) # 100容量的数据
pw=Process(target=wrtie,args=(qu,))
pr=Process(target=read,args=(qu,))
pw.start()
pr.start()
pw.join()
pr.join()
输出结果:
写入数据....a
读取数据 a
写入数据....b
读取数据 b
写入数据....c
读取数据 c
写入数据....d
读取数据 d
写入数据....end
读取结束
数据写入完成
此外,如果我们想和python 程序外的一些程序进行数据通信的话,可以使用 subprocess 模块。
比如,使用我们的python 调出我们windows系统自带的计算器。
import subprocess as sp
sp.call(r"C:\Windows\System32\calc.exe",shell=True)
shell默认为False,在Linux下,shell=False时, Popen调用os.execvp()执行args指定的程序;shell=True时,如果args是字符串,Popen直接调用系统的Shell来执行args指定的程序,如果args是一个序列,则args的第一项是定义程序命令字符串,其它项是调用系统Shell时的附加参数,如在Linux下可以使用 call(["ls", "-l"])
等同于在执行 ls -l
命令。
使用windows的ping命令,通过序列的方式(第一个为命令,第二个为参数)。
import subprocess as sp
res=sp.call(["ping","www.baidu.com"],shell=True)
输出:
���� Ping www.a.shifen.com [14.215.177.39] ���� 32 �ֽڵ�����:
���� 14.215.177.39 �Ļظ�: �ֽ�=32 ʱ��=47ms TTL=55
���� 14.215.177.39 �Ļظ�: �ֽ�=32 ʱ��=48ms TTL=55
���� 14.215.177.39 �Ļظ�: �ֽ�=32 ʱ��=47ms TTL=55
���� 14.215.177.39 �Ļظ�: �ֽ�=32 ʱ��=47ms TTL=55
14.215.177.39 �� Ping ͳ����Ϣ:
���ݰ�: �ѷ��� = 4���ѽ��� = 4����ʧ = 0 (0% ��ʧ)��
�����г̵Ĺ���ʱ��(�Ժ���Ϊ��λ):
��� = 47ms��� = 48ms��ƽ�� = 47ms
由于windows的CMD默认使用的是GBK编码,而Python中使用的是UTF-8编码,所以输出会部分乱码。
如果想获得进程执行后的结果可以使用 getoutput() 方法,他的返回值是一个字符串类型,保存着子进程执行的结果。
import subprocess as sp
# sp.call(r"C:\Windows\System32\calc.exe",shell=True)
# res=sp.getoutput("ping www.baidu.com")
res=sp.getoutput(["ping","www.baidu.com"])
print(res)
输出:
正在 Ping www.a.shifen.com [14.215.177.39] 具有 32 字节的数据:
来自 14.215.177.39 的回复: 字节=32 时间=49ms TTL=55
来自 14.215.177.39 的回复: 字节=32 时间=47ms TTL=55
来自 14.215.177.39 的回复: 字节=32 时间=47ms TTL=55
来自 14.215.177.39 的回复: 字节=32 时间=48ms TTL=55
14.215.177.39 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 47ms,最长 = 49ms,平均 = 47ms
提示:这里的 www.a.shifen.com 是百度的另一个域名,如果直接 ping baidu.com 显示的就是我们熟悉的百度域名了。