zoukankan      html  css  js  c++  java
  • 队列

    加锁可以保证多个进程修改同一块数据时,同一时间只能有一个任务可以进行修改,即串行地修改,没错,速度是慢了,但牺牲了速度却保证了数据安全。

    虽然可以用文件共享数据实现进程间通信,但问题是:

    1、效率低(共享数据基于文件,而文件是硬盘上的数据)

    2、需要自己加锁处理

    我们最好找寻一种解决方案能够兼顾:

    1、效率高(多个进程共享一块内存的数据)

    2、帮我们处理好锁问题。

    这就是mutiprocessing模块为我们提供的基于消息的IPC通信机制:队列和管道。

    队列和管道都是将数据存放于内存中,而队列又是基于(管道+锁)实现的,可以让我们从复杂的锁问题中解脱出来,因而队列才是进程间通信的最佳选择。

    我们应该尽量避免使用共享数据,尽可能使用消息传递和队列,避免处理复杂的同步和锁问题,而且在进程数目增多时,往往可以获得更好的可获展性。

    队列介绍

    进程彼此之间互相隔离,要实现进程间通信(IPC),multiprocessing模块支持两种形式:队列和管道,这两种方式都是使用消息传递的

    创建队列的类(底层就是以管道和锁定的方式实现):

    Queue([maxsize]):创建共享的进程队列,Queue是多进程安全的队列,可以使用Queue实现多进程之间的数据传递。
    

    参数介绍:

    maxsize是队列中允许最大项数,省略则无大小限制。
    但需要明确:
        1、队列内存放的是消息而非大数据
        2、队列占用的是内存空间,因而maxsize即便是无大小限制也受限于内存大小
    

    主要方法介绍:

    q.put方法用以插入数据到队列中。
    q.get方法可以从队列读取并且删除一个元素。

     

    队列的使用

    from multiprocessing import Queue
    
    q = Queue(3)   # 队列里面不应该放大文件,队列的目的:1是进程之间的通信,进程从队列中取出数据,2可以不指定大小,用的是内存,受限于内存的大小
    
    q.put("hello")   # 队列里放数据,任何数据都可以
    q.put({"a": 1})
    q.put([3, 3, 3])
    print(q.full())  # 判断队列中数据是否满了(满了后就会原地卡住)
    
    print(q.get())    # 先进先出
    print(q.get())
    print(q.get())
    print(q.empty())    # 判断队列是否空 (空了后就会原地卡住) 
    

    True
    hello
    {'a': 1}
    [3, 3, 3]
    True

     
  • 相关阅读:
    TOJ1017: Tour Guide
    tzcacm去年训练的好题的AC代码及题解
    Educational Codeforces Round 40 (Rated for Div. 2)
    AtCoder Regular Contest 092
    浙南联合训练赛20180318
    [Offer收割]编程练习赛50
    牛客练习赛13
    AtCoder Regular Contest 091
    Codeforces Round #470 (rated, Div. 2, based on VK Cup 2018 Round 1)
    csa Round #73 (Div. 2 only)
  • 原文地址:https://www.cnblogs.com/fantsaymwq/p/10129003.html
Copyright © 2011-2022 走看看