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

  • 相关阅读:
    使用pjsip传输已经编码的视频
    xubuntu14.04下编译pjsip及pjsua2 java
    解决 Python.h:没有那个文件或目录 错误的方法
    HIbernate與不支持boolean的數據庫之間的映射
    js数组的操作
    jQuery中ajax的使用与缓存问题的解决方法
    网络游戏中应用可插拔工厂处理消息
    How to Train Triplet Networks with 100K Identities?
    (转)如何用TensorLayer做目标检测的数据增强
    图像超分辨-IDN
  • 原文地址:https://www.cnblogs.com/TaoR320/p/12680100.html
Copyright © 2020-2023  润新知