一个python队列,感觉像一个iterable,并且知道它的生产者何时完成

iterable-queue的Python项目详细描述


#Iterable queue
准备放松。上一次是您最后一次在多进程python程序中使用不必要的混乱逻辑来管理生产者池和消费者池。##

假设您有一个消费队列中任务的*consumers*池,它由*producers*池填充。当然,只要队列不为空,您就希望消费者继续从队列中提取工作。


最棘手的部分是,如果消费者速度很快,即使生产者仍在忙于添加工作,他们也可能继续将队列驱动为空。那么,
消费者如何知道工作是否真的完成了,或者队列是否只是暂时的空的?

如果您有一个生产者和多个消费者,或者如果您有一个消费者和多个生产者,您可以通过在
队列上发送特殊的"完成"信号来管理它。我觉得这也有点烦人,但是当有很多生产者和消费者时,事情就变得更复杂了。


第二次消费。队列本身知道
暂时为空与"完成"之间的区别*

`iterablequeue`是一个定向队列,这意味着它有
(任意多个)*producer endpoints*和*consumer endpoints*。

因为它知道何时完成,所以它可以支持iterable接口。这意味着对于消费者来说,队列看起来就像一个iterable。消费者甚至不必知道他们有排队。

生产者使用队列的方式与"多处理.队列"非常相似,但是有一个小的变化:当他们完成对队列的工作时,他们应该调用"queue.close()":

`"python
`"生产者函数(队列):
,而一些条件:

队列.放置(一些工作)

queue.close()
```

您可以选择"手动"使用队列,方法是调用"queue.get()"。
它将委托给底层的"multiprocessing.queue",并支持所有常用参数。在队列上调用'get()',使用'block=true'和
'timeout=none'(默认值)将引发'queue.empty',如果队列为空,
与通常一样。但是,如果队列不只是空的,而是正确的*done*(即
没有更多的活动生产者)`iterablequeue.done`将被引发


两者都包装相同的底层
`multiprocessing.queue`,并且几乎公开*其所有方法。
重要的异常是"put()"和"get()"方法:您只能将
`put()`放到生产者终结点上,并且只能从使用者终结点"get()"。这一区别对于consumer
迭代的管理是需要的,以便自动工作。

让我们首先设置一个将由*producer s*执行的函数,即
放入*队列的工人:

``python
def producer func(queue,producer\u id):
对于范围(10)内的i:
queue.put(producer\u id)
queue.close()
```


请注意,在将
内容放入队列后,生产者如何调用"queue.close()"。

现在,让我们设置一个使用者函数:
``python
def consumersumer_id):
对于队列中的项:
print('consumer%d看到了项%d'%(consumer_id,item))
````

注意consumer是如何将队列视为iterable的。

现在,让我们开始一些进程:

``python

from multiprocessing import process
fromiterable queue import iterablequeue

num廑producers=3
num廑consumers=5


ueue=iq.get_producer()
p=process(target=producer_func,args=(queue,producer_id))
p.start()
producers.append(p)


consumer椆endpoint=iq.get椆consumer()
p=process(target=consumer椆func,args=(consumer椆endpoint,consumer椆id))
p.start()
consumer.append(p)

TS将被制作成

等待工作人员完成
p in producers+consumers:
p.join()

````

不发信号,不跟踪进程完成情况,
也不尝试…除了空的`,只需放在一端,然后在另一端迭代。

您可以通过运行[`example.py`](https://github.com/enewe101/iterable_queue/blob/master/iterable_queue/example.py)来尝试上面的示例。


``````
consumer 1 saw item 0
consumer 1 saw item 0
consumer 1 saw item 0
consumer 1 saw item 0
W项目0
消费者0锯项目1
消费者1锯项目1
消费者2锯项目0
消费者0锯项目0
消费者2锯项目1
消费者0锯项目0
消费者1锯项目2
消费者0锯项目1
消费者2锯项目2
消费者1锯项目1
消费者1 SAW项目2
消费者3 SAW项目0
消费者2 SAW项目1
消费者1 SAW项目2
消费者2 SAW项目1
消费者3 SAW项目2
消费者3 SAW项目1
消费者0 SAW项目2
消费者1 SAW项目2
消费者2 SAW项目1
消费者4 SAW项目1
消费者2 SAW项目2
消费者4锯项目2
```

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
Java RMI客户端访问被拒绝   java让JavaFX事件监听器与我的方法对话   java与xml spring配置相关   java当我在字符串中插入这个XML Soap请求时,为什么Eclipse会给我一个错误?   音频音频合成   java创建了一个Tic-Tac-Toe应用程序,我有一个bug,它每次在同一个正方形上声明一个平局   java为返回的字符串值设置参数   Java中的ClassFormatError   java在启动后更改Spring云配置服务器uri   用Java中的自定义类替换默认字符串类   java junit测试套件:ClassNotFoundException   java自定义对象集包含相同的对象   通过关系查找的java Spring数据CRUDepository   java将数据存储到aerospike中   java使用itextpdf将添加内容的pdf转换为安卓中的位图   java正在遍历队列的concurrentHashMap,以查看是否所有队列都是空的,而其他线程可能会添加到队列中   java Hibernate:未找到本机查询异常   java Mockito准确地验证所有参数   java我可以在它自己的类中声明一个对象吗?