进程间通讯的三种方式

# 进程间通讯
# 1、进程对列multiprocessing.Quere
import multiprocessing, time

def foo(q):
    time.sleep(1)
    print(‘son process‘, id(q))
    q.put(123)
    q.put(‘alex‘)

if __name__ == ‘__main__‘:
    q = multiprocessing.Queue()
    print(‘main process‘, id(q))
    p = multiprocessing.Process(target=foo, args=(q,))
    p.start()

    print(q.get())
    print(q.get())

# 2、管道 pipe()
from multiprocessing import Process, Pipe

def f(conn):
    conn.send([12, {‘name‘: ‘alex‘}, ‘hello‘])
    response = conn.recv()
    print(‘response‘, response)
    conn.close()
    print(‘q_ID2:‘, id(conn))

if __name__ == ‘__main__‘:
    parent_conn, child_conn = Pipe()  # 双向管道
    print(‘q_ID1:‘, id(child_conn))
    p = Process(target=f, args=(child_conn,))
    p.start()
    print(parent_conn.recv())
    parent_conn.send(‘儿子你好‘)
    p.join()

# 3、Managers 实现数据共享 (Queue和Pipe只是实现数据交互,没有实现数据共享,即一个进程去更改另一个进程的数据)
from multiprocessing import Process, Manager

def f(d, l, i):
    d[i] = ‘1‘  # {0: ‘1‘}
    d[‘2‘] = 2  # {0: ‘1‘, ‘2‘: 2}

    l.append(i)  # [0, 1, 2, 3, 4, 0]

    print(‘son process:‘, id(d), id(l))

if __name__ == ‘__main__‘:
    with Manager() as manager:
        d = manager.dict()  # 创建Manager字典 {}
        l = manager.list(range(5))  # 创建Manager列表 [0, 1, 2, 3, 4]

        print(‘main process:‘, id(d), id(l))

        p_list = []
        for i in range(10):
            p = Process(target=f, args=(d, l, i))
            p.start()
            p_list.append(p)

        for res in p_list:
            res.join()

        print(d)
        print(l)

原文地址:https://www.cnblogs.com/dangrui0725/p/9499310.html

时间: 2024-09-30 18:14:07

进程间通讯的三种方式的相关文章

进程间共享句柄三种方式

windows核心编程第三章中,句柄的共享讲了三种方式 1.在创建句柄的时候,设置可继承,在创建进程时,让子进程继承句柄, 然后通过各种途径(如命令行参数.环境变量.发送消息)让子进程知道即可.2.复制句柄,得先知道目的进程,然后在目标进程中复制句柄, 最后通过各种途径(如发送消息)通知目标进程3.给句柄命名,进程间相互知道名字即可. 第3种在使用Mutex限制只运行一个实例时已使用,前2种没有例子,因此自己写了个实例. 运行后,点击创建进程,会创建一个文件句柄,并置为可继承,然后创建一个环境变

容器间通信的三种方式 - 每天5分钟玩转 Docker 容器技术(35)

容器之间可通过 IP,Docker DNS Server 或 joined 容器三种方式通信. IP 通信 从上一节的例子可以得出这样一个结论:两个容器要能通信,必须要有属于同一个网络的网卡. 满足这个条件后,容器就可以通过 IP 交互了.具体做法是在容器创建时通过 --network 指定相应的网络,或者通过 docker network connect 将现有容器加入到指定网络.可参考上一节 httpd 和 busybox 的例子,这里不再赘述. Docker DNS Server 通过 I

【转】VC 线程间通信的三种方式

原文网址:http://my.oschina.net/laopiao/blog/94728 1.使用全局变量(窗体不适用)      实现线程间通信的方法有很多,常用的主要是通过全局变量.自定义消息和事件对象等来实现的.其中又以对全局变量的使用最为简洁.该方法将全局变量作为线程监视的对象,并通过在主线程对此变量值的改变而实现对子线程的控制.      由于这里的全局变量需要在使用它的线程之外对其值进行改变,这就需要通过volatile关键字对此变量进行说明.使用全局变量进行线程通信的方法非常简单

线程间通信的三种方式(NSThread,GCD,NSOperation)

一.NSThread线程间通信 #import "ViewController.h" @interface ViewController ()<UIScrollViewDelegate> @property (strong, nonatomic) IBOutlet UIScrollView *scrollView; @property (weak, nonatomic)  UIImageView *imageView; @end @implementation ViewCo

Android线程间通讯的几种方式

1.runOnUiThread(Runnable)              在子线程中直接使用该方法,可以更新UI runOnUiThread(new Runnable(){//更新UI                    @Override                    public void run() {                        publish_time.setText("更新失败");                    }         

Android(IPC)进程间通讯1:详解Binder由来?

完整原文:http://tryenough.com/android-ipc1 Android开发的进程间通讯,整个Android的应用都依赖于binder做底层通信机制.而Linux中提供的进程间通讯方式并没有binder机制,那么android中为什么要单独创造这种通讯方式呢?带着这个问题,继续往下读. Linux中进程相关概念 Linux将系统内存划分成了 用户空间 和 内核空间 两部分: 用户空间 : 普通应用程序则运行在用户空间上,它们不能使用某些特定的系统功能,不能直接访问硬件,不能直

Linux 进程间通讯方式 pipe()函数 (转载)

转自:http://blog.csdn.net/ta893115871/article/details/7478779 Linux 进程间通讯方式有以下几种: 1->管道(pipe)和有名管道(fifo). 2->消息队列 3->共享内存 4->信号量 5->信号(signal) 6->套接字(sicket) 在这里我们看一下第一种====管道(pipe).有名管道(fifo)见其它文章. eg :我们以前学的命令 cat  file | grep  "abc

不同vlan间的通信简单配置(三种方式)

不同vlan间的通信简单配置 1.单臂路由(图) 环境:一台路由器,一台二层交换机,两台pc机 二层交换机的配置一般模式:Switch>输入enable进入特权模式:Switch>enable输入configure terminal进入全局配置模式:Switch#configure terminal Enter configuration commands, one per line.  End with CNTL/Z.创建vlan 10 和 vlan 20:Switch(config)#vl

异步回调函数-创建进程的三种方式

回调函数 有两个类,A,B,在类A中调用B,在B中调用A的方法完成A的工作,那么这个在B类中调用的A的函数就称为回调函数. 异步回掉函数:类A将自己的工作交给类B后,继续执行剩下的程序,而B继续完成A交给的工作. 使用方法: 1.定义一个接口 2.A可以直接继承此接口,也可以定义一个内部类继承此接口: 定义一个方法,调用B中的方法 3.B中的方法调用A中的方法. //定义接口 public interface doJob { public void fillBlank(int a,int b,i