Hi,

> Thanks for taking this on, Victor.
> 
> Do you have a small eventlet program example that you can show the
> transformation to asyncio?

Example getting the body of an HTML page and display it to the terminal. The 
HTTP query is invalid, the Host header is missing, but supporting HTTP/1.0 and 
the connected mode would make the example more complex.

Eventlet version:
---
import eventlet
from eventlet.green import socket

def getbody(url, limit=1024):
    c = socket.socket()
    ip = socket.gethostbyname(url)
    c.connect((ip, 80))
    c.sendall('HEAD /\r\n\r\n')
    body = c.recv(limit)
    return body

body = getbody('www.python.org')
print(body)
---

Trollius version:
---
import asyncio
import logging; logging.basicConfig()
from asyncio import Return
import socket

@asyncio.coroutine
def getbody(url):
    reader, writer = yield asyncio.open_connection(url, 80)
    writer.write('HEAD /\r\n\r\n')
    # yield writer.drain()
    body = yield reader.read()
    raise Return(body)

loop = asyncio.get_event_loop()
body = loop.run_until_complete(getbody('www.python.org'))
print(body)
loop.close()
---

Remarks:

 - no special "sendall" method: writer.write() always write all data, and it's 
the same name for any kind of transport (socket, SSL socket, pipe, etc.)
 - open_connection() accepts directly an hostname. It resolves the hostname 
asynchronously (call socket.gethostbyname in a pool of threads)
 - it's possible to call reader.read() with no limit: in this case, read() 
stops when the server closes the connection. Using eventlet, you have to buffer 
manually. There is also a convinient readline() buffer which reads until it 
gets a newline character ("\n")
 - run_until_complete() is only used in short examples, usually run_forever() 
is preferred, something will call loop.stop() to stop the loop

You can uncomment "writer.drain()" to wait until all data are sent to the 
server. Otherwise, it will be done in background asynchronously.

See asyncio documentation for more examples:
http://docs.python.org/dev/library/asyncio.html

Victor

_______________________________________________
OpenStack-dev mailing list
OpenStack-dev@lists.openstack.org
http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev

Reply via email to