进程间通讯

Posted momo8238

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了进程间通讯相关的知识,希望对你有一定的参考价值。

1. 不同进程间内存是不共享的,要想实现两个进程间的数据交换,可以用下面的方法。

2. 线程Queue, 用于不同线程之间的互相访问,生产者消费者模型。

3. 进程Queue,

4. 主线程与子线程之间是可以互相访问内存的。主线程中生成了一个队列,子线程可以往队列里放元素,主线程可以访问到队列里所放的对象。

    线程之间的数据共享。

from multiprocessing import Process #主线程和子线程的内存是共享的。
import threading
import queue

def f():
    q.put([42, None, ‘hello‘]) #子线程往队列里面放了一个数据

if __name__ == ‘__main__‘:
    q = queue.Queue()  #主线程定义了一个队列
    p=threading.Thread(target=f,) #生成一个子线程
    p.start()    
    p.join()
print(q.get())  # 父线程去访问这个数据

 运行结果:

[42, None, ‘hello‘]

 

5. 进程间的数据,无法相互访问。子进程与父进程的内存是相互独立的。

 

from multiprocessing import Process #主线程和子线程的内存是共享的。
import threading
import queue

def f():
    q.put([42, None, ‘hello‘]) #子进程无法访问主进程里面定义的队列

if __name__ == ‘__main__‘:
    q = queue.Queue()  #主进程定义了一个队列
    #p=threading.Thread(target=f,) #生成一个子线程
    p=Process(target=f,) #主进程生成一个子进程
    p.start()
    p.join()
    print(q.get())  # 父进程去访问这个数据

 运行结果:

Process Process-1:
Traceback (most recent call last):
  File "multiprocessing\process.py", line 249, in _bootstrap
  File "multiprocessing\process.py", line 93, in run
  File "C:\abccdxddd\Oldboy\Py_Exercise\Day10\ex2.py", line 6, in f
    q.put([42, None, ‘hello‘]) #子进程无法访问主进程里面定义的队列
NameError: name ‘q‘ is not defined

 

6.那么,进程间如果要相互访问,该怎么办呢?

线程queue无法传给进程,进程queue才能传给进程。

from multiprocessing import Process #主线程和子线程的内存是共享的。
import threading
import queue

def f(qq):
    qq.put([42, None, ‘hello‘]) #子线程往队列里面放了一个数据

if __name__ == ‘__main__‘:
    q = queue.Queue()  #主线程定义了一个队列
    p=Process(target=f,args=(q,)) #生成一个子进程,并且把主进程里面定义的队列传给子进程。
    p.start()
    p.join()
    print(qq.get())  # 父线程去访问这个数据

 运行结果:

C:\abccdxddd\Oldboy\python-3.5.2-embed-amd64\python.exe C:/abccdxddd/Oldboy/Py_Exercise/Day10/ex2.py
Traceback (most recent call last):
  File "C:/abccdxddd/Oldboy/Py_Exercise/Day10/ex2.py", line 11, in <module>
    p.start()
  File "multiprocessing\process.py", line 105, in start
  File "multiprocessing\context.py", line 212, in _Popen
  File "multiprocessing\context.py", line 313, in _Popen
  File "multiprocessing\popen_spawn_win32.py", line 66, in __init__
  File "multiprocessing\reduction.py", line 59, in dump
TypeError: can‘t pickle _thread.lock objects

 

7.把父进程的queue传给了子进程。相当于父进程把queue copy了一份,传给了子进程。是两个独立的queue。

为了要实现两个queue里面的数据的同步,把子进程里面放的数据序列化了,放到一个中间位置,然后再反序列化传给

父进程。两个进程直接是无法直接访问各自的内存地址的。虽然看上去是一个共享queue,但实际上有pickle的过程。

from multiprocessing import Process,Queue #主线程和子线程的内存是共享的。
import threading
#import queue

def f(qq):
    qq.put([42, None, ‘hello‘]) #子线程往队列里面放了一个数据

if __name__ == ‘__main__‘:
    q = Queue()  #主线程定义了一个队列
    p=Process(target=f,args=(q,)) #生成一个子进程,并且把主进程里面定义的队列传给子进程。
    p.start()
    p.join()
    print(q.get())  # 父线程去访问这个数据

 运行结果:

[42, None, ‘hello‘]

 

8.

 

以上是关于进程间通讯的主要内容,如果未能解决你的问题,请参考以下文章

wpf进程间通讯

linux进程间通讯-System V IPC 信号量

Linux 进程间通讯详解一

进程间通讯(linux C/Python)

进程和线程的关系及区别,进程间如何通讯,线程间如何通讯

win32进程间通讯--共享内存