On 09:40 pm, t...@urandom.ca wrote:
On Wed, 2009-09-23 at 20:50 +0000, exar...@twistedmatrix.com wrote:
immediately outside the generator. This means that you cannot use
"enhanced generators" to implement an API like this one:
def doSomeNetworkStuff():
s = corolib.socket()
s.connect(('google.com', 80))
s.sendall('GET / HTTP/1.1\r\nHost: www.google.com\r\n\r\n')
response = s.recv(8192)
where connect, sendall, and recv don't actually block the entire
calling
thread, they only switch away to another coroutine until the
underlying
operation completes. With "real" coroutines, you can do this.
I might be missing some subtlety of your point, but I've implemented
this functionality using generators in a library called Kaa[1]. In
kaa,
your example looks like:
import kaa
@kaa.coroutine()
def do_some_network_stuff():
s = kaa.Socket()
yield s.connect('google.com:80')
yield s.write('GET / HTTP/1.1\nHost: www.google.com\n\n')
response = yield s.read()
do_some_network_stuff()
kaa.main.run()
I specifically left out all "yield" statements in my version, since
that's exactly the point here. :) With "real" coroutines, they're not
necessary - coroutine calls look just like any other call. With
Python's enhanced generators, they are.
Jean-Paul
--
http://mail.python.org/mailman/listinfo/python-list