进程和队列练习
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
调试了一晚上………………这个坑挖的我无发可脱。
求躲坑秘籍。
以上是关于进程和队列练习的主要内容,如果未能解决你的问题,请参考以下文章