zoukankan      html  css  js  c++  java
  • 进程间的通信

    方式1 queue队列 先进先出

    进程之间默认是没有关联的,进程间的通信就是解决这个问题

    from multiprocessing import Queue, Process这是解决普通进程间的通信
    from multiprocessing import Manager, Pool这是解决进程间的通信

    queue是阻塞的

    from multiprocessing import Queue, Process
    import os
    import time

    def write(q):
    for value in [1, 2, 3]:
    print("put %d to queue"%value)
    q.put(value)
    time.sleep(1)

    def read(q):
    while True:
    if not q.empty():
    value = q.get()
    print("get %d from queue" % value)
    time.sleep(1)
    else:
    break

    if __name__ == "__main__":
    queue =Queue()
    pw = Process(target= write, args=(queue,)) ##这里就是把queue当作一个参数穿了进去。这样两个进程就和同一个queue相关联
    pr = Process(target=read, args=(queue,))
    pw.start()
    pw.join()
    pr.start()
    pr.join()
    print("complete")
    Result:

    put 1 to queue
    put 2 to queue
    put 3 to queue
    get 1 from queue
    get 2 from queue
    get 3 from queue
    complete

    进程池之间的通信

    from multiprocessing import Manager, Pool
    import os
    import time

    def write(q):
    for value in [1, 2, 3]:
    print("put %d to queue"%value)
    q.put(value)
    time.sleep(1)

    def read(q):
    #while True:
    #if not q.empty():
    #value = q.get()
    # print("get %d from queue" % value)
    # time.sleep(1)
    #else:
    #break
      
      for value in range(q.qsize()):
      print("get %d from queue" % q.get())


    if __name__ == "__main__":
    q = Manager().Queue() #使用Manager中的Queue来初始化
    po = Pool()
    po.apply(write,(q,))#使用阻塞时创建进程, 这样就不用在read中使用死循环了
    po.apply(read,(q,))
    po.close()
    po.join()
    print("complete")
    queue.Queue和multiprocessing.Queue是不同的:

    Queue.Queue is just an in-memory queue that knows how to deal with multiple threads using it at the same time. It only works if both the producer and the consumer are in the same process.

    Once you have them in separate system processes, which is what the multiprocessing library is about, things are a little more complicated, because the processes no longer share the same memory. You need some kind of inter-process communication method to allow the two processes to talk to each other. It can be a shared memory, a pipe or a socket, or possibly something else. This is what multiprocessing.Queue does. It uses pipes to provide a way for two processes to communicate. It just happens to implement the same API as Queue.Queue, because most Python programmers are already familiar with it.

    Also note that the way you are using the queue, you have a race condition in your program. Think about what happens if the write process writes to the queue right after you call q.empty() in the read process. Normally you would add some special item to the queue (e.g. None) which would mean that the consumer can stop.

  • 相关阅读:
    mac上finalShell的安装
    c 字符串与字符串操作
    .net5 MailKit
    c 99乘法表
    element 动态表单加自定义校验
    遇到的问题 vscode 问题
    vue-element-admin eslint 规则查询表
    利用html2canvas 导出网页 (只是用于自己的笔记,如果需要看配置,自行查找插件api)
    git 常用命令
    uniapp中自动打包微信小程序后自动上传代码
  • 原文地址:https://www.cnblogs.com/shamoguzhou/p/14979694.html
Copyright © 2011-2022 走看看