zoukankan      html  css  js  c++  java
  • 进程间通信

    参考博客:http://blog.csdn.net/HeatDeath/article/details/72844120

    一、前言

      线程存在于进程中,对于同一个进程内的线程,该进程内的资源是共享的,各个线程可以竞争获取。而不同的进程有独立的内存空间,它们之间不能直接相互访问,那么进程和进程间如何相互通信呢?

    二、进程间通信

      2.1 Queue()

      在线程中有个队列queue,典型的应用在生产者和消费者模型中。而Queue()则用于进程间通信,使用和线程queue差不多。  

    from multiprocessing import Process, Queue
    import os
    import time
    import random
    
    
    # 写数据进程执行的代码:
    def write(x):
        print('Process to write: %s' % os.getpid())
        for value in ['A', 'B', 'C']:
            print('Put %s to queue...' % value)
            x.put(value)
            time.sleep(random.random())
    
    
    # 读数据进程执行的代码:
    def read(x):
        print('Process to read: %s' % os.getpid())
        while True:
            value = x.get()
            print('Get %s from queue.' % value)
    
    
    if __name__ == '__main__':
        # 父进程创建Queue,并传给各个子进程:
        q = Queue()
        pw = Process(target=write, args=(q,))
        pr = Process(target=read, args=(q,))
        # 启动子进程pw,写入:
        pw.start()
        # 启动子进程pr,读取:
        pr.start()
        # 等待pw结束:
        pw.join()
        # pr进程里是死循环,无法等待其结束,只能强行终止:
        pr.terminate()
    

      2.2 Pipe()

      Pipe()函数返回一对由管道连接的连接对象,默认情况下是双工(双向)。

      Pipe()返回的两个连接对象代表管道的两端。 每个连接对象都有send()和recv()方法(等等) 

    rom multiprocessing import Process, Pipe
    
    
    def f(conn):
        conn.send([1, 2, 3])  # 子进程发送
        while True:
            print('receive from parent process:', conn.recv())   # 子进程接收
    
    if __name__ == '__main__':
        parent_conn, child_conn = Pipe()   # 定义连接对象
        p = Process(target=f, args=(child_conn,))
        p.start()
        print('receive from child process:', parent_conn.recv())
        parent_conn.send('123')
        p.terminate()
    
    
    # 输出
    receive from child process: [1, 2, 3]
    receive from parent process: 123
    

      

  • 相关阅读:
    如何使用 Python 進行字串格式化
    骨牌摆放问题 POJ 2411(状态压缩DP)
    ACM/OI中C++常用优化(实用/调试/技巧)代码(语法)
    Windows 系统如何完全卸载 VSCode
    Python 在VSCode中使用
    第十一场训练赛
    L1-046 整除光棍 (20分)
    Problem 330A
    POJ 2187 Beauty Contest (凸包 旋转卡壳)
    程序员:写作能收获什么?
  • 原文地址:https://www.cnblogs.com/bigberg/p/7997809.html
Copyright © 2011-2022 走看看