小编Mic*_*ael的帖子

Asyncio + aiohttp - redis Pub/Sub和websocket在单个处理程序中读/写

我正在玩aiohttp,看看它将如何作为带有websocket连接的移动应用程序的服务器应用程序.

这是一个简单的"Hello world"示例(这里是gist):

import asyncio
import aiohttp
from aiohttp import web


class WebsocketEchoHandler:

    @asyncio.coroutine
    def __call__(self, request):
        ws = web.WebSocketResponse()
        ws.start(request)

        print('Connection opened')
        try:
            while True:
                msg = yield from ws.receive()
                ws.send_str(msg.data + '/answer')
        except:
            pass
        finally:
            print('Connection closed')
        return ws


if __name__ == "__main__":
    app = aiohttp.web.Application()
    app.router.add_route('GET', '/ws', WebsocketEchoHandler())

    loop = asyncio.get_event_loop()
    handler = app.make_handler()

    f = loop.create_server(
        handler,
        '127.0.0.1',
        8080,
    )

    srv = loop.run_until_complete(f)
    print("Server started at {sock[0]}:{sock[1]}".format(
        sock=srv.sockets[0].getsockname()
    ))
    try:
        loop.run_forever()
    except …
Run Code Online (Sandbox Code Playgroud)

python redis python-asyncio aiohttp

16
推荐指数
1
解决办法
7004
查看次数

从`call_soon`回调函数执行协同程序

我有以下情况:

  • 一些内部类(我无法控制)正在callback使用call_soon执行我的函数.
  • 在我的内心,callback我想打电话给另一个courotune,但结果是"冻结"回调.

我将使用call_soon()修改Hello World来演示:

import asyncio

def hello_world(loop):
    print('Hello')
    # Call some coroutine.
    yield from asyncio.sleep(5, loop=loop)
    print('World')
    loop.stop()

loop = asyncio.get_event_loop()

# Schedule a call to hello_world()
loop.call_soon(hello_world, loop)

# Blocking call interrupted by loop.stop()
loop.run_forever()
loop.close()
Run Code Online (Sandbox Code Playgroud)

当我运行它时,没有任何东西正在打印,程序永远不会结束.

按Ctrl + C

Traceback (most recent call last):
  File "../soon.py", line 15, in <module>
    loop.run_forever()
  File "/usr/lib/python3.4/asyncio/base_events.py", line 276, in run_forever
    self._run_once()
  File "/usr/lib/python3.4/asyncio/base_events.py", line 1136, in _run_once
    event_list = …
Run Code Online (Sandbox Code Playgroud)

python python-3.4 python-asyncio

7
推荐指数
1
解决办法
5729
查看次数

“读取器”进程死亡后,multiprocessing.Queue死锁

我一直在使用多处理程序包,并注意到在以下情况下,队列可能会死锁以进行读取:

  1. “阅读器”进程正在使用get with timeout > 0:

    self.queue.get(timeout=3)
    
    Run Code Online (Sandbox Code Playgroud)
  2. “读者”模而获取因阻塞超时

之后,该队列将永远锁定。

演示问题的应用程序

我创建两个子进程“ Worker”(放入队列)和“ Receiver”(从队列获取)。父进程还会定期检查他的孩子是否还活着,并在需要时开始新的孩子。

self.queue.get(timeout=3)
Run Code Online (Sandbox Code Playgroud)

ps中树的处理方式

bash
 \_ python queuetest.py
     \_ Worker
     \_ Receiver
Run Code Online (Sandbox Code Playgroud)

控制台输出

$ python queuetest.py
Worker: putting msg, Queue size: ~0
<<< `msg from Worker`, queue rlock: <Lock(owner=None)>
Worker: putting msg, Queue size: ~0
<<< `msg from Worker`, queue rlock: <Lock(owner=None)>
Restarting receiver                        <-- killed Receiver with SIGTERM
Worker: putting msg, Queue size: ~0
Worker: putting msg, Queue size: ~1 …
Run Code Online (Sandbox Code Playgroud)

python queue multiprocessing python-2.7

5
推荐指数
1
解决办法
1276
查看次数