进程间通讯-1-传递函数的方法
1. 不同进程间内存是不共享的,要想实现两个进程间的数据交换,可以用下面的方法。
2. 线程Queue, 用于同一主程序下的不同线程之间的互相访问,(生产者消费者模型)。出了这个进程以后,就没法访问了。导入方法:import queue;定义方法 q=queue.Queue( )
3. 进程Queue,导入方法from multiprocessing import Queue, 定义方法: q=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,) #生成一个子线程,指明函数入口为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才能传给进程。(因为进程queue的传递有一个pickle序列化的过程,而线程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传给了子进程。相当于父进程把queue 克隆了一份,传给了子进程。是两个独立的queue。
为了要实现两个queue里面的数据的同步,把子进程里面放的数据序列化了,放到一个中间位置,然后再反序列化传给
父进程。两个进程之间是无法直接访问各自的内存地址的。虽然看上去是一个共享queue,但实际上有pickle的过程,还有一个中间容器。
只是实现了进程间数据的传递,还没有实现同时修改一份数据。
from multiprocessing import Process,Queue #主线程和子线程的内存是共享的。
import threading
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']