免责声明:这可能是一个非常基本的问题,但我只是不理解这个概念,因此无法实现我想要的。
我正在尝试使用 asyncio 实现基本的 echo 客户端服务器。我从文档中包含的示例开始。
我想要实现的是持久连接,客户端可以在任何时间而不是立即 connection_made向服务器发送一些数据,然后读取响应(如果有的话)。连接必须在两端保持打开状态,直到显式关闭。
我正在使用协议示例进行此操作。阅读其他问题/文档,似乎我可以使用 来实现这个loop.call_later()
,但这真的是一个好的解决方案吗?理想情况下,我希望使用 aQueue
能够立即响应新数据包。
我最终得到了这段代码,它是从“MyProtocol”调用的。初始化`:
@asyncio.coroutine
def writer():
global out_queue
while True:
packt = yield from out_queue.get()
print("yeahhh packet yummy")
data = bytes(packt.to_json(), 'ascii')
self.transport.write(data)
asyncio.async(writer())
但这无济于事。我假设当从主客户端代码插入新项目时,这会立即打印出消息。什么都没发生...
进一步调试显示队列正在被填满,但 out_queue.get() 协程永远不会返回。最初 out_queue.put 甚至将项目直接放入服务员中以进行初始 .get() 调用,但就好像循环没有运行一样。它与用于整个客户端连接的循环相同(我创建了一个新循环,因为我将所有内容都放入了一个线程中)。我已经检查过,从 .put() 调用中进行的适当调用都是针对这个循环的。
哦,以防万一:我在 python 3.3 上运行它,通过 pip 安装 asyncio。
更新:这就是我尝试将项目插入队列的方式:
def send_packet(loop, queue, packet):
# this runs in main thread, not the loop thread
def f():
print("putting packet into queue")
queue.put_nowait(packet) # MUST NOT use .put() as it's a coroutine
loop.call_soon_threadsafe(f)
# !!! next one doesn't work !!!
# loop.call_soon_threadsafe(any_normal_function_with_coroutine_calls())
print
从不执行。