进程和队列练习

Posted momoon

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了进程和队列练习相关的知识,希望对你有一定的参考价值。

# !/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

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

求躲坑秘籍。

 

以上是关于进程和队列练习的主要内容,如果未能解决你的问题,请参考以下文章

为啥我无法附加到此 MPI 代码的引导队列?

处理器调度算法

消息传递队列linux的问题

处理器调度算法

# Java 常用代码片段

# Java 常用代码片段