zoukankan      html  css  js  c++  java
  • 【LemonCK】MacOS关于Python进程队列qsize的坑

    背景介绍

    由于Python自带的Queue队列模块,无法实现进程之间全局变量的共享问题,所以只能通过multiprocessing.Queue实现。

    但是MacOS系统上,还是被坑到怀疑人生。。。希望跟我一样遇到这个问题的朋友,看完此帖能恍然大悟。

    正文

    实现思路:创建一个队列,添加10个任务,再创建两个进程,去处理这个队列中的所有任务。

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    """
    @File:multiprocessDemo3.py    
    @E-mail:364942727@qq.com
    @Time:2020/9/29 10:31 下午 
    @Author:Nobita   
    @Version:1.0   
    @Desciption:多进程之间的通讯
    """
    
    import requests
    from multiprocessing import Process, Queue
    
    num = 1
    
    
    def work1(q):
        # 判断队列中是否有任务
        while q.qsize() > 0:
            global num
            # 获取任务
            url = q.get()
            # 执行任务
            requests.get(url)
            print('work1正在执行任务-------执行次数:{}'.format(num))
            num += 1
    
    
    def work2(q):
        # 判断队列中是否有任务
        while q.qsize() > 0:
            global num
            # 获取任务
            url = q.get()
            # 执行任务
            requests.get(url)
            print('work2正在执行任务-------执行次数:{}'.format(num))
            num += 1
    
    
    if __name__ == '__main__':
        q = Queue()
        # 创建1个队列,添加10个任务
        for i in range(10):
            q.put('http://192.168.4.169:5000')
        # 创建2个进程,处理这个队列中的10个任务
        p1 = Process(target=work1, args=(q,))
        p2 = Process(target=work2, args=(q,))
        p1.start()
        p2.start()

    然鹅却报错了:

    检查了好几遍代码,都觉得没有问题,这个时候,我不禁陷入了沉思。。。

    最后去查阅了一下multiprocess.Queue的源码,发现了这个。。。

     再然后去百度了一下这方面的资料,发现翻车的老铁还挺多,所以最终得出结论:MacOS平台无法执行qsize这个函数。

  • 相关阅读:
    JavaScript深入解读
    CentOS7上安装与配置Tomcat8与MySQL5.7
    码云的初步使用
    MySQL安装与初步操作
    自定义消息队列
    用Executors工具类创建线程池
    Java中的BlockingQueue队列
    Restful对于URL的简化
    docker push 实现过程
    通过docker-machine和etcd部署docker swarm集群
  • 原文地址:https://www.cnblogs.com/chenshengkai/p/13755314.html
Copyright © 2011-2022 走看看