进程间通讯
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.
以上是关于进程间通讯的主要内容,如果未能解决你的问题,请参考以下文章