我正在玩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) 我有以下情况:
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) 我一直在使用多处理程序包,并注意到在以下情况下,队列可能会死锁以进行读取:
“阅读器”进程正在使用get with timeout > 0:
self.queue.get(timeout=3)
Run Code Online (Sandbox Code Playgroud)“读者”模而获取因阻塞超时。
之后,该队列将永远锁定。
我创建两个子进程“ Worker”(放入队列)和“ Receiver”(从队列获取)。父进程还会定期检查他的孩子是否还活着,并在需要时开始新的孩子。
self.queue.get(timeout=3)
Run Code Online (Sandbox Code Playgroud)
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)