进程间通讯-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 "multiprocessingprocess.py", line 249, in _bootstrap
  File "multiprocessingprocess.py", line 93, in run
  File "C:abccdxdddOldboyPy_ExerciseDay10ex2.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:abccdxdddOldboypython-3.5.2-embed-amd64python.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 "multiprocessingprocess.py", line 105, in start
  File "multiprocessingcontext.py", line 212, in _Popen
  File "multiprocessingcontext.py", line 313, in _Popen
  File "multiprocessingpopen_spawn_win32.py", line 66, in __init__
  File "multiprocessing
eduction.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']

原文地址:https://www.cnblogs.com/momo8238/p/7357088.html