Search code examples
pythonwebsocketgeneratoryield-from

Why does this Python program using yield from not work?


I started with the following base code that works (Like the sample code at http://aaugustin.github.io/websockets/):

import asyncio
import websockets

@asyncio.coroutine
def servePlayer(websocket, path):
    yield from websocket.send("Hello World")

start_server = websockets.serve(servePlayer, 'localhost', 8765)
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()

I modified this a bit to something similar but which no longer works. I don't know why. Here's the modified version:

import asyncio
import websockets

class Player:
    def __init__(self, connection):
        self.connection = connection
    def send(self, data):
        print("sending")
        yield from self.connection.send(data)

@asyncio.coroutine
def servePlayer(websocket, path):
    player = Player(websocket)
    player.send("Hello World")

start_server = websockets.serve(servePlayer, 'localhost', 8765)
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()

The code does not even reach the "sending" line.


Solution

  • Your player.send() method is a generator too; you need to delegate to that generator:

    @asyncio.coroutine
    def servePlayer(websocket, path):
        player = Player(websocket)
        yield from player.send("Hello World")