websocketsとasyncioを使ってメッセージを受信する非同期処理を作成しています。
一つのメッセージを受け取った後、一定程度の処理をした後にwebに接続という流れのプログラムを考えています。
今回相談したいのは、前回の処理メッセージを受け取り、処理している最中に、次のメッセージの処理を始めることは可能でしょうかという点です。
clientの処理でいうと、eventメソッドのwait終わりのメッセージが表示される前に「受け取り直後」というメッセージを表示させたいと思っています。
12/27追記
gatherを使ったコードに変更してみました。
メソッド1とメソッド2が同時に始まるようになったのですが、受け取ったメッセージに対して、メソッド1と2が終わらないと、次のメッセージの受け取りが始まりません。
メソッド1だけ終わったら次のメッセージを受け取りに行くといった形にしたいのですが、可能でしょうか?
client
1import asyncio 2import json 3import websockets 4import urllib.request 5import urllib.error 6import datetime 7 8# --- 9 10 11 async with websockets.connect(uri, ping_timeout=None) as ws: 12 while not ws.closed: 13 14 response = await ws.recv() 15 board = json.loads(response) 16 await asyncio.gather( 17 event(board), 18 get_url() 19 ) 20 21async def event(board): 22 print('これから5秒待つ' + str(board)) 23 await asyncio.sleep(5) 24 print('wait終わり') 25 print(datetime.datetime.now()) 26 27 28async def get_url(): 29 url = 'http://www.fukushizaidan.jp/' 30 req = urllib.request.Request(url) 31 with urllib.request.urlopen(req) as res: 32 print(res.read()) 33 34loop = asyncio.get_event_loop() 35loop.create_task(stream()) 36try: 37 loop.run_forever() 38except KeyboardInterrupt: 39 exit()
server
1#!/usr/bin/env python 2 3# WS server that sends messages at random intervals 4 5import asyncio 6import datetime 7import random 8import websockets 9import json 10 11 12async def time(websocket, path): 13 while True: 14 now = datetime.datetime.utcnow().isoformat() + "Z" 15 char = 'longlongstr' 16 content = {'message': char, 'time': str(now)} 17 j_content = json.dumps(content) 18 await websocket.send(j_content) 19 await asyncio.sleep(random.random() * 3) 20 21start_server = websockets.serve(time, "127.0.0.1", 5678) 22 23asyncio.get_event_loop().run_until_complete(start_server) 24asyncio.get_event_loop().run_forever()
<結果>
これから5秒待つ{'message': 'longlongstr', 'time': '2020-12-26T23:43:58.316069Z'}
b'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
wait終わり
2020-12-27 08:44:03.311604
これから5秒待つ{'message': 'longlongstr', 'time': '2020-12-26T23:44:00.082327Z'}
b'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
wait終わり
2020-12-27 08:44:08.321386
これから5秒待つ{'message': 'longlongstr', 'time': '2020-12-26T23:44:02.372114Z'}
b'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/12/27 07:48
退会済みユーザー
2020/12/27 08:13 編集
2020/12/27 08:45