【python】【queue】验证多进程下queue不会丢数据-可靠

为了保证多进程下程序运行的稳定性需要用到queue队列,但需要保证queue必须100%可靠,所以验证一下queue是否绝对稳定;
脚本主要验证有没有漏掉数据;

验证方法:

1、至少2个(脚本30个)进程向queue写入数据
2、一个进程读取数据
确保:读取的数据必须和写入的数据量一致,不一致那么queue就不可靠

# -*- encoding: utf-8 -*-
"""
验证queue在多线程put是没有问题的
queue在多线程时不会丢数据
"""
import sys
import re
import time
from multiprocessing import Process, cpu_count, Queue

put_num = 200000
put_multiprocess = 30
get_num = put_num * put_multiprocess


def test_queue():
    q = Queue()
    puts = []
    for i in range(put_multiprocess):
        puts.append(Process(target=multiprocess_puts, args=(q,)))

    get = Process(target=multiprocess_get, args=(q,))
    get.start()
    for p in puts:
        p.start()

    for p in puts:
        p.join()
    get.join()


def multiprocess_puts(q):
    for i in range(put_num):
        q.put(i)


def multiprocess_get(q):
    # las
    for i in range(get_num):
        q.get()
        print(i)
        if i + 1 // 1000 == 0:
            print(i)


if __name__ == '__main__':
    test_queue()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中,多进程可以通过使用`multiprocessing`模块来实现。在多进程中,为了实现进程间通信,我们通常会使用`queue`模块提供的队列数据结构。但是,在使用`queue`时,有时候会出现数据失的情况,这是因为`queue`在多进程中的实现方式与在单进程中的实现方式不同,需要特别注意。 在多进程中,`queue`模块提供了两种队列类型:`Queue`和`JoinableQueue`。其中,`JoinableQueue`是`Queue`的子类,它提供了额外的`task_done()`和`join()`方法,用于在多进程中同步队列的状态。 当我们在多进程中使用`Queue`时,需要注意以下几点: 1. 在多进程中,`Queue`对象不能直接在进程之间共享,需要使用`multiprocessing.Manager`来创建共享的`Queue`对象。 2. 在向`Queue`中添加数据时,需要使用`put()`方法,而不是`append()`方法。 3. 在从`Queue`中获取数据时,需要使用`get()`方法,而不是`pop()`方法。 4. 在使用`Queue`时,需要注意队列的大小,如果队列已满,`put()`方法会阻塞,直到队列中有空间为止。 5. 在使用`Queue`时,需要注意队列的关闭,如果队列已关闭,`put()`方法会抛出`Queue.Closed`异常,`get()`方法会抛出`Queue.Empty`异常。 如果在使用`Queue`时出现数据失的情况,可能是由于以下原因: 1. 在向队列中添加数据时,使用了`append()`方法而不是`put()`方法。 2. 在从队列中获取数据时,使用了`pop()`方法而不是`get()`方法。 3. 在使用队列时,没有考虑队列的大小和关闭状态,导致数据弃或者阻塞。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值