いいえ、socket.sendto
は非ブロックであるとは限りません。 ADDR(A transport->依存ターゲットアドレス)によって与えられたリモートピアにデータバイトを送信
:
代わりに、DatagramTransport.sendtoを使用します。 addrがNoneの場合、データはトランスポート作成時に指定されたターゲットアドレスに送信されます。
この方法はブロックされません。は、データをバッファリングし、非同期に送信するように手配します。
データグラムの輸送はloop.create_datagram_endpointコルーチンで返されます。
transport, protocol = await loop.create_datagram_endpoint(factory, sock=sock)
EDIT - あなたのコメントについて:
は(transport.sendtoに相当socket.sendto()です)?
はありません、それはtransport.sendto
操作ノンブロッキングを作るためにloop.add_writer
を使用して、ではありません。 implementationを参照してください。
このメソッドは、コールバックスタイルのプロトコルでデータを受け取るように実装されているため、このメソッドを使用したくありません。
低レベルのasyncioはコールバックに基づいており、asyncioはUDPにコルーチンベースのオブジェクトを提供しません。しかし、私はmodule that provides high-level UDP endpoints for asyncioと書いています。
使用法:
async def main():
local = await open_local_endpoint()
remote = await open_remote_endpoint(*local.address)
remote.write(b'Hey Hey, My My')
data, addr = await local.read()
message = "Got {data!r} from {addr[0]} port {addr[1]}"
print(message.format(data=data.decode(), addr=addr))
出力:
Got 'Hey Hey, My My' from 127.0.0.1 port 45551
[2432814](http://stackoverflow.com/questions/2432814/python-blocking-sockets-send-returns-immediately)duplicate? – ldavid
「search Q&A」の投稿を紛失して申し訳ありません。私は「sendto non-blocking」、「asyncioループで使うsendtoは安全です」などのキーワードで検索していました。 – SpringMaple