• 进程和队列练习


    # !/usr/bin/env python3
    # -*- coding: utf-8 -*-
    # @Time : 2020/5/31 17:24
    # @Author : "小多肉"
    # @Email : 1021181701@qq.com
    # @File : 进程和队列.py
    # @Software: PyCharm
    
    
    #TODO:
    """
    一、使用队列和进程完成下面要求
    1、用一个队列来存储数据
    2、创建一个专门生产数据的进程类,当队列中数据数量少于50时,开始生产数据,每次生产200个数据,添加到队列中,
    每生产完一轮 暂停1秒
    3、创建一个专门获取数据的进程类,当 队列中数据数量  大于10时就开始获取,,循环获取,每次获取20个。
    当队列中数据数量  少于10的时候,暂停2秒
    4、 创建一个进程生产数据 ,5个进程获取数据
    """
    import random
    import time
    from multiprocessing import Process, Queue
    
    
    class GenDataWork(object):
        def __init__(self, queue):
            self.q = queue
    
        def gen_data(self):
            """队列长度小于50时,随机生成数据200个数据"""
            if self.q.qsize() < 50:
                print("队列数据小于50个")
                for i in range(200):
                    self.q.put(random.random())
                print("生成200个数据的任务已完成,暂停1秒。")
            time.sleep(1)
    
    
    class GetDataWork:
    
        def __init__(self,queue):
            self.q = queue
    
        def get_data(self):
            """获取数据"""
            while True:
                if self.q.qsize() > 10:
                    for i in range(20):
                        data = self.q.get()
                        print(f"第{i}次获取的数据是{data}")
                elif self.q.qsize() < 10:
                    print("队列数据少于10个,暂停2秒")
                    time.sleep(2)
                    break
                else:
                    break
    
    
    def decorator(fun):
        def wrapper(*args, **kwargs):
            start_time = time.time()
            print("-------start--------", start_time)
            fun(*args, **kwargs)
            end_time = time.time()
            print("-------end--------", end_time)
            dur_time = end_time - start_time
            print(f"{fun.__name__}函数的运行时间为:{dur_time}")
        return wrapper
    
    
    
    @decorator
    def main(q):
        p_list = []
        p1 = Process(target=GenDataWork(q).gen_data)
        p1.start()
        for i in range(5):
            p = Process(target=GetDataWork(q).get_data)
            p.start()
            p_list.append(p)
        p1.join()
        for p in p_list:
            p.join()
    
    
    if __name__ == '__main__':
        q = Queue()
        main(q)

    在此遇到 一个被气哭的问题。Mac OS居然不支持Queue.qsiez(),会报错下面错误:

      File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/multiprocessing/queues.py", line 117, in qsize
        return self._maxsize - self._sem._semlock._get_value()
    NotImplementedError

    调试了一晚上………………这个坑挖的我无发可脱。

    求躲坑秘籍。

  • 相关阅读:
    STM32的DMA
    stm32f1的IO,推挽与开漏
    STM32_GPIO配置及库函数讲解——独立按键
    STM32-外部中断学习笔记
    关于STM32的NVIC问题
    梯度下降<1>
    QString toInt()函数慎用
    linux→查看当前系统时间和修改系统当前时间
    oracle函数→数值型函数
    oracle函数→字符型函数
  • 原文地址:https://www.cnblogs.com/momoon/p/13022555.html
Copyright © 2020-2023  润新知