- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我尝试创建一个客户端,它使用 asyncio.Queue 来提供我想发送到服务器的消息。从 websocket 服务器接收数据效果很好。发送由生产者刚刚生成的数据也有效。为了解释什么有效,什么失败,首先是我的代码:
import sys
import asyncio
import websockets
class WebSocketClient:
def __init__(self):
self.send_queue = asyncio.Queue()
#self.send_queue.put_nowait('test-message-1')
async def startup(self):
await self.connect_websocket()
consumer_task = asyncio.create_task(
self.consumer_handler()
)
producer_task = asyncio.create_task(
self.producer_handler()
)
done, pending = await asyncio.wait(
[consumer_task, producer_task],
return_when=asyncio.ALL_COMPLETED
)
for task in pending:
task.cancel()
async def connect_websocket(self):
try:
self.connection = await websockets.client.connect('ws://my-server')
except ConnectionRefusedError:
sys.exit('error: cannot connect to backend')
async def consumer_handler(self):
async for message in self.connection:
await self.consumer(message)
async def consumer(self, message):
self.send_queue.put_nowait(message)
# await self.send_queue.put(message)
print('mirrored message %s now in queue, queue size is %s' % (message, self.send_queue.qsize()))
async def producer_handler(self):
while True:
message = await self.producer()
await self.connection.send(message)
async def producer(self):
result = await self.send_queue.get()
self.send_queue.task_done()
#await asyncio.sleep(10)
#result = 'test-message-2'
return result
if __name__ == '__main__':
wsc = WebSocketClient()
asyncio.run(wsc.startup())
连接效果很好。如果我从我的服务器向客户端发送一些东西,这也很好用,并在 consumer() 中打印消息。但是生产者永远不会收到我在 consumer()
中放入 send_queue 的任何消息。
之所以在consumer()
中选择send_queue.put_nowait,是为了防止死锁。如果我使用 await self.send_queue.put(message)
行而不是 self.send_queue.put_nowait(message)
这行没有区别。
我想,也许队列根本不起作用,所以我在 __init__()
创建时向队列填充了一些东西: self.send_queue.put_nowait("test-message -1")
。这有效并发送到我的服务器。所以队列的基本概念和 await queue.get()
起作用了。
我还想,也许生产者有问题,所以让我们在运行时随机生成消息:result = "test-message-2"
而不是 result = await self .send_queue.get()
。这也有效:每 10 秒“test-message-2”发送到我的服务器。
编辑:如果我尝试将来自其他来源的东西即时添加到队列中,也会发生这种情况。我构建了一个小型异步套接字服务器,可以将任何消息推送到队列,效果很好,您可以在 consumer()< 中看到我使用
,但仍然没有成功 qsize()
从其他来源添加的消息queue.get()
。所以队列本身似乎可以工作,只是 get()
不行。顺便说一句,这也是排队的原因:我想从完全不同的来源发送数据。
所以,这就是我卡住的地方。我的疯狂猜测是我在 producer()
中使用的队列与在 consumer()
中使用的队列不同,如果您使用非线程,在线程中很容易发生这种情况- 像 asyncio.Queue 这样的安全队列,但据我了解,我根本不使用线程,只是协程。那么,这里还有什么问题吗?
仅供引用:它是 docker 容器内的 Ubuntu 20.04 python 3.8.2。
谢谢,埃内斯托
最佳答案
仅供记录 - 我的问题的解决方案非常简单:我在我的 websocket 客户端创建的事件循环之外定义了 send_queue
。所以它调用了 events.get_event_loop()
并获得了自己的循环 - 这不是主循环的一部分,因此从未调用过,因此 await queue.get()
真的从不得到任何返回。
在正常模式下,您看不到任何提示此问题的消息。但是,python 文档来拯救:当然他们在 https://docs.python.org/3/library/asyncio-dev.html 提到了它: logging.DEBUG
提供了我找到问题所需的提示。
关于具有队列 : asyncio. 的 Python 3.8 websocket 回显客户端 Queue get() 不会即时添加队列项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61440186/
我试图弄清楚以下模块正在做什么。 import Queue import multiprocessing import threading class BufferedReadQueue(Queue.
如果我使用 Queue.Queue,那么我的 read() 函数不起作用,为什么?但是,如果我使用 multiprocessing.Queue,它运行良好: from multiprocessing
我正在寻找比我在文档中找到的更多关于 Python 队列实现的见解。 根据我的理解,如果我在这方面有误,请原谅我的无知: queue.Queue():通过内存中的基本数组实现,因此不能在多个进程之间共
当我使用多处理模块(Windows 上的 Python 2.7)中的队列代替 Queue.Queue 时,我的程序没有完全关闭。 最终,我想使用 multiprocessing.Process 处理
阅读了大量的 JavaScript 事件循环教程,我看到了不同的术语来标识队列存储消息,当调用堆栈为空时,事件循环准备好获取消息: 队列 消息队列 事件队列 我找不到规范的术语来识别它。 甚至 MDN
我收到错误消息“类型队列不接受参数”。当我将更改队列行替换为 PriorityQueue 时,此错误消失并且编译正常。有什么区别以及如何将其更改为编译队列和常规队列? import java.util
如何将项目返回到 queue.Queue?如果任务失败,这在线程或多处理中很有用,这样任务就不会丢失。 docs for queue.Queue.get()说函数可以“从队列中删除并返回一个项目”,但
如何在多个 queue.Queue 上进行“选择”同时? Golang 有 desired feature及其 channel : select { case i1 = 声明。 线程:queue 模
http://docs.python.org/2/library/queue.html#Queue.Queue.put 这似乎是一个幼稚的问题,但我在文档和谷歌搜索中都没有找到答案,那么这些方法是线程
这可能是个愚蠢的问题,但我对与 .dequeue() 和 $.queue() 一起使用的 .queue() 感到困惑> 或 jquery.queue()。 它们是否相同,如果是,为什么 jquery
我正在尝试创建一个线程化的 tcp 流处理程序类线程和主线程对话,但是 Queue.Queue 也没有做我需要的,服务器从另一个程序接收数据,我只想传递它进入主线程进行处理这里是我到目前为止的代码:
The principal challenge of multi-threaded applications is coordinating threads that share data or ot
在Queue模块的queue类中,有几个方法,分别是qsize、empty 和 full,其文档声称它们“不可靠”。 他们到底有什么不可靠的地方? 我确实注意到 on the Python docs网
我需要一个队列,多个线程可以将内容放入其中,并且多个线程可以从中读取。 Python 至少有两个队列类,Queue.Queue 和 collections.deque,前者似乎在内部使用后者。两者都在
明天我将介绍我选择进程内消息队列实现的基本原理,但我无法阐明我的推理。我的合作设计者提议我们实现一个简单的异步队列,只使用基本的作业列表和互斥锁来控制访问,我建议在嵌入式模式下使用 ActiveMQ。
在 scala 中定义了一个特征: trait Queue[T] Queue 是一种类型吗?或其他东西,例如类型构造函数? 来自 http://artima.com/pins1ed/type-para
我看到 SML/NJ 包含一个队列结构。我不知道如何使用它。如何使用 SML/NJ 提供的附加库? 最佳答案 Queue structure SML '97 未指定,但它存在于 SML/NJ 的顶级环
我是 D3 和 JavaScript 的新手。 我试图理解其中的 queue.js。 我已经完成了 this关联。但是仍然无法清楚地了解 queue.await() 和 queue.awaitAll(
所以我试图在我的 main.cpp 文件中调用一个函数,但我得到“错误:没有匹配函数来调用‘Queue::Queue()。” 队列.h #ifndef QUEUE_H #define QUEUE_H
假设我有一个 10 行的二维 numpy 数组 例如 array([[ 23425. , 521331.40625], [ 23465. , 521246.03125],
我是一名优秀的程序员,十分优秀!