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 显示的就是我们熟悉的百度域名了。

你可能感兴趣的:(#,python,python,进程间通行)