zoukankan      html  css  js  c++  java
  • 进程间通讯-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']
    

  • 相关阅读:
    java学习day02---Spring Boot综合运用---活动模块
    java学习day01---GC
    课程学习总结报告
    结合中断上下文切换和进程上下文切换分析Linux内核的一般执行过程
    深入理解系统调用
    基于mykernel 2.0编写一个操作系统内核
    超码 候选码 主码 替换码 数据库 定义
    如何评测软件工程知识技能水平?
    创新产品的需求分析:未来的图书会是什么样子?
    案例分析:设计模式与代码的结构特性(桥接模式)
  • 原文地址:https://www.cnblogs.com/momo8238/p/7357088.html
Copyright © 2011-2022 走看看