Changes before gevent 1.0¶
Release 0.13.8 (September 6, 2012)¶
Fixed issue #80: gevent.httplib failed with RequestFailed errors because timeout was reset to 1s. Patch by Tomasz Prus.
core: fix compilation with the latest Cython: remove emit_ifdef/emit_else/emit_endif.
Fixed issue #132: gevent.socket.gethostbyname(<unicode>) now does ascii encoding and uses gevent’s resolver rather than calling built-in resolver. Patch by Alexey Borzenkov.
Release 0.13.7 (April 12, 2012)¶
Fixed issue #94: fallback to buffer if memoryview fails in _get_memory on python 2.7.
Fixed issue #103:
Queue(None).full()returnsFalsenow (previously it returnedTrue).Fixed issue #112: threading._sleep is not patched. Thanks to David LaBissoniere.
Fixed issue #115: _dummy gets unexpected Timeout arg.
Release 0.13.6 (May 2, 2011)¶
Added
__copy__method togevent.local.localclass that implements copy semantics compatible with built-inthreading.local. Patch by Galfy Pundee.Fixed
StreamServerclass to catchEWOULDBLOCKrather thanEAGAIN. This fixes lots of spurious tracebacks on Windows where these two constants are not the same. Patch by Alexey Borzenkov.Fixed issue #65:
fork()now callsevent_reinitonly in the child process; otherwise the process could hang when using libevent2. Patch by Alexander Boudkar.
Release 0.13.5 (Apr 21, 2011)¶
Fixed build problem on Python 2.5
Release 0.13.4 (Apr 11, 2011)¶
Fixed
TypeErrorthat occurred whenenviron["wsgi.input"].readfunction was called with an integer argument.Fixed issue #63:
monkey.patch_thread()now patchesthreadingtoo, even if it’s already imported. Patch by Shaun Lindsay.Fixed issue #64:
joinall()andkillall()functions used to hang if their argument contained duplicate greenlets.Fixed issue #69:
pywsgi.WSGIServerreported “Connection reset by peer” if the client did not close the connection gracefully after the last request. Such errors are now ignored.Fixed issue #67: Made
wsgi.WSGIServeraddREQUEST_URIto environ. Patch by Andreas Blixt.Fixed issue #71: monkey patching
httplibwithgevent.httplibused to breakHTTPSConnection. Patch by Nick Barkas.Fixed issue #74:
create_connectionnow raises proper exception whengetaddrinfofails.Fixed
BaseServer.__repr__()method,BaseServer.server_hostandBaseServer.server_portattributes to handle the case ofAF_UNIXaddresses properly. Previously they assumed address is always a tuple.Fixed
pywsgi.WSGIServerto handleAF_UNIXlisteners. The server now setsenviron["SERVER_NAME"]andenviron["SERVER_PORT"]to empty string in such case.Make
StreamServer(and thuspywsgi.WSGIServer) accept up to 100 connections per one readiness notification. This behaviour is controlled byStreamServer.max_acceptclass attribute.If bind fails, the servers now include the address that caused bind to fail in the error message.
Release 0.13.3 (Feb 7, 2011)¶
Fixed typo in
gevent.httplibthat rendered it unusable.Removed unnecessary delay in
getaddrinfoby callingresolve_ipv4andresolve_ipv6concurrently rather than sequentially inAF_UNSPECcase.
Release 0.13.2 (Jan 28, 2011)¶
Added
gevent.httplib– experimental support for libevent-http client (issue #9). Thanks to Tommie Gannert, Örjan Persson.Fixed crash on Mac OS X (issue #31). Patch by Alexey Borzenkov.
Fixed compatiblity of
gevent.wsgiwith libevent2 (issue #62).Fixed compilation issues with libevent2. Patch by Ralf Schmitt.
Fixed
pywsginot to use chunked transfer encoding in case of 304 and 204 responses as it creates a non-empty message body which is against RFC and causes some browsers to fail. Patch by Nicholas Piël.Fixed
socket.getaddrinfo()to handleAF_UNSPECproperly and resolve service names (issue #56). Thanks to Elizabeth Jennifer Myers.Fixed
socket.getaddrinfo()to handle international domain names.Fixed leaking of traceback object when switching out of greenlet with
sys.exc_infoset. Leaking is prevented by not preserving traceback at all and only keeping the value of the exception. Thanks to Ned Rockson.Fixed
ssl.SSLSocket.unwrap()to shutdownSSLSocketproperly, without raisingSSLError(read operation timeout).Fixed
TypeErrorinsideHubon Python 2.4.Made a number of internal improvements to
gevent.pywsgito make subclassing easier.Changed
WSGIServerto explicitly close the socket after the last request. Patch by Ralf Schmitt.Fixed
pywsgi.WSGIHandlernot to addCONTENT_TYPEto the environ dict when there’s noContent-Typeheader in the request. Previously a defaulttext/plainwas added in such case.Added proper implementation of
imap_unorderedtoPoolclass. Unlike previous “dummy” implementation this one starts yielding the results as soon as they are ready.Implemented iterator protocol in
Queue. The main use case is the implementation ofPool.imap_unordered().Fixed
BaseServer.startedproperty: it is now set toTrueafterstartuntilstoporkill. Previously it could becomeFalsefor short period of times, becauseStreamServercould stop accepting for a while in presence of errors andStreamServer.startedwas defined as “whether the server is currently accepting”.Fixed
wsgi.WSGIServerto reply with 500 error immediately if the application raises an error (issue #58). Thanks to Jon Aslund.Added
monkey.patch_httplib()function which is disabled by default.Added httplib parameter to
monkey.patch_all()(defaults toFalse).Added
writemethod tocore.buffer.Fixed
OverflowErrorthat could happen incore.event.__str__().Made
http_request.get_input_headers()return header names in lower case.Fixed
StreamServerto accept ciphers as an SSL argument.Added
build_exc --cython=option tosetup.py. Patch by Ralf Schmitt.Updated
localto raiseAttributeErrorif__dict__attribute is set or deleted.
Release 0.13.1 (Sep 23, 2010)¶
Release highlights:
Fixed
monkeyto patchsocket.create_connection.Updated
gevent.sslmodule to fully match the functionality ofsslon Python 2.7.Fixed
Group.join()to handleraise_error=Trueproperly, it used to raiseTypeError(issue #36). Thanks to by David Hain.Fixed
gevent.wsgiandgevent.pywsgito join multipleCookieheaders (issue #40).Fixed
selectto recognizelongarguments in addition toint.Fixed
Semaphore.acquire()to returnFalsewhen timeout expires instead of raisingAssertionError(issue #39). Patch by Erik Näslund.Fixed
JoinableQueue.join()to return immediately if queue is already empty (issue #45). Patch by Dmitry Chechik.Deprecated
gevent.ssloldmodule.
gevent.socket module:
Overrode
socket.shutdown()method to interrupt read/write operations on socket.Fixed possible
NameErrorinsocket.connect_ex()method. Patch by Alexey Borzenkov.Fixed socket leak in
create_connection()function.Made
gevent.socketimport all public items from stdlibsocketthat do not do I/O.
gevent.ssl module:
Imported a number of patches from stdlib by Antoine Pitrou:
Calling
makefile()method on an SSL object would prevent the underlying socket from being closed until all objects get truly destroyed (Python issue #5238).SSL handshake would ignore the socket timeout and block indefinitely if the other end didn’t respond (Python issue #5103).
When calling
getpeername()inSSLSocket.__init__, only silence exceptions caused by the “socket not connected” condition.
Added support for ciphers argument.
Updated
SSLSocket.sendandSSLSocket.recvmethods to match the behavior of stdlibsslbetter.Fixed
ssl.SSLObjectto delete events used by other greenlets when closing the instance (issue #34).
Miscellaneous:
Made
BaseServeracceptlongvalues as pool argument in addition toint.Made
http._requestsattribute public.Updated webchat example to use file on disk rather than in-memory sqlite database to avoid
OperationalError.Fixed
webproxy.pyexample to be runnable under external WSGI server.Fixed bogus failure in
test__exc_info.py.Added new test to check PEP8 conformance:
xtest_pep8.py.Fixed
BackdoorServerclose the connection onSystemExitand simplified the code.Made
PoolraiseValueErrorwhen initialized withsize=0.Updated
setup.py --libeventto configure and make libevent if it’s not built already.Updated
setup.pyto usesetuptoolsif present and add dependency ongreenlet.Fixed doc/mysphinxext.py to work with Sphinx 1. Thanks by Örjan Persson.
Release 0.13.0 (Jul 14, 2010)¶
Release highlights:
Added
gevent.servermodule withStreamServerclass for easy implementing of TCP and SSL servers.Added
gevent.baseservermodule withBaseServerclass.Added new implementation of
gevent.pywsgibased ongevent.server. Contributed by Ralf Schmitt.Added
gevent.localmodule. Fixed issue #24. Thanks to Ted Suzman.Fixed a number of bugs in
gevent.wsgimodule.Fixed issue #26: closing a socket now interrupts all pending read/write operations on it.
Implemented workaround that prevents greenlets from leaking
exc_info.Fixed
socket.sendall()to use buffer object to prevent string copies.Made the interfaces of
gevent.wsgiandgevent.pywsgimuch more similar to each other.Fixed compilation on Windows with libevent-2.
Improved Windows compatibility. Fixed issue #30. Thanks to Luigi Pugnetti.
Fixed compatibility with Python 2.7.
Backward-incompatible changes:
Blocking is now the default behaviour for the
Greenlet.kill()method and other kill* methods.Changed the inteface of
http.HTTPServerto match the interface of other servers.Changed
Pool’sspawn()method to block until there’s a free slot.Removed deprecated
backdoor.backdoor_server()function.Removed deprecated functions in
socketmodule:socket_bind_and_listen()set_reuse_addr()connect_tcp()tcp_server()
Removed deprecated
socket.fdproperty.Deprecated use of negative numbers to indicate infinite timeout in
core.event.add()andsocket.wait_read()and similar. UseNonefrom now on, which is compatible with the previous versions.Derived
backdoor.BackdoorServerfromStreamServerrather than fromGreenlet. This adds lots of new features and removes a few old ones.Removed non-standard
balanceproperty fromSemaphore.Removed
start(),set_cb()andset_gencb()fromcore.http.Removed
set_closecb()fromcore.http_connection. It is now used internally to detach the requests of the closed connections.Deprecated
rawgreenletmodule.Deprecated
util.lazy_property().Renamed
GreenletSettoGroup. The old name is currently available as an alias.
gevent.socket module:
Fixed issues issue #26 and issue #34: closing the socket while reading/writing/connecting is now safe. Thanks to Cyril Bay.
Imported
getfqdn()fromsocketmodule.The module now uses
sys.platformto detect Windows rather thanplatformmodule.Fixed issue #27:
getaddrinfo()used to handle the case when socktype or proto were equal to0. Thanks to Randall Leeds.
gevent.coros module:
Added
RLockclass.Added
DummySemaphoreclass.Fixed
BoundedSemaphoreclass to behave likethreading.BoundedSemaphorebehaves.
gevent.event module:
Made
Event.wait()return internal flag instead ofNone.Made
AsyncResult.wait()return itsvalueinstead ofNone.Added
ready()method as an alias foris_set().
gevent.wsgi module:
Removed
wsgi.buffer_proxy.
gevent.pywsgi module:
Rewritten to use
serverand not to depend onBaseHTTPServer.Changed the interface to match
wsgimodule. Removedserver()function, addServerclass, addedWSGIServerclass.Renamed
HttpProtocoltoWSGIHandler.Fixed compatibility with webob by allowing an optional argument to
readline().
gevent.core module:
Fixed reference leaks in
eventclass.Avoid Python name lookups when accessing EV_* constants from Cython code. Patch by Daniele Varrazzo.
Added persist argument to
read_event,write_eventandreadwrite_event.Made all of the event loop callbacks clear the exception info before exiting.
Added
flags_strproperty toevent. It is used by__str__and__repr__.buffer:Added
detach()method.Implemented iterator protocol.
Fixed
readline()andreadlines()methods.
http_request:Fixed
detach()to detach input and output buffers too.Changed the response to send 500 error upon deallocation, if no response was sent by the user.
Made
input_bufferandoutput_bufferstore and reuse thebufferobject they create.Fixed
__str__()and meth:__repr__to include spaces where needed.httpclass no longer hasset_cb()andset_gencb(). Instead its contructor accepts handle which will be called on each request.
gevent.http and gevent.wsgi modules:
Made
HTTPServeruse"Connection: close"header by default.Class
HTTPServernow derives frombaseserver.BaseServer. Thus itsstart()method no longer accepts socket to listen on, it must be passed to the contructor.The spawn argument now accepts a
Poolinstance. While the pool is full, the server replies with 503 error.The server no longer links to the greenlets it spawns to detect errors. Instead, it relies on
http_requestwhich will send 500 reply when deallocated if the user hasn’t send any.
Miscellaneous:
Changed
gevent.threadto useGreenletinstead of raw greenlets. This means monkey patched thread will becomeGreenlettoo.Added
startedproperty toGreenlet.Put common server code in
gevent.baseservermodule. All servers in gevent package are now derived fromBaseServer.Fixed issue #20:
sleep()now raisesIOErrorif passed a negative argument.Remove the code related to finding out libevent version from setup.py as macro
USE_LIBEVENT_?is no longer needed to buildgevent.core.Increased default backlog in all servers (from 5 to 256). Thanks to Nicholas Piël.
Fixed doc/conf.py to work in Python older than 2.6. Thanks to Örjan Persson.
Silenced SystemError raised in
backdoorwhen a client typedquit().If importing
greenletfailed with ImportError, keep the original error message, because sometimes the error originates in setuptools.Changed
select.select()to return all the file descriptors signalled, not just the first one.Made
thread(and thus monkey patched threads) to spawnGreenletinstances, rather than raw greenlets.
Examples:
Updated echoserver.py to use
StreamServer.Added geventsendfile.py.
Added wsgiserver_ssl.py.
Thanks to Ralf Schmitt for pywsgi, a number of fixes for wsgi, help with
baseserver and server modules, improving setup.py and various other patches and suggestions.
Thanks to Uriel Katz for pywsgi patches.
Release 0.12.2 (Mar 2, 2010)¶
Fixed http server to put the listening socket into a non-blocking mode. Contributed by Ralf Schmitt.
Release 0.12.1 (Feb 26, 2010)¶
Removed a symlink from the distribution (that causes pip to fail). Thanks to Brad Clements for reporting it.
setup.py: automatically create symlink from
build/lib.../gevent/core.sotogevent/core.so.gevent.socket: Improved compatibility with stdlib’s socket:
Release 0.12.0 (Feb 5, 2010)¶
Release highlights:
Added
gevent.sslmodule.Fixed Windows compatibility (experimental).
Improved performance of
socket.recv(),socket.send()and similar methods.Added a new module -
dns- with synchronous wrappers around libevent’s DNS API.Added
core.readwrite_eventandsocket.wait_readwrite()functions.Fixed several incompatibilities of
wsgimodule with the WSGI spec.Deprecated
pywsgimodule.
gevent.wsgi module:
Made
env["REMOTE_PORT"]into a string.Fixed the server to close the iterator returned by the application.
Made
wsgi.inputobject iterable.
gevent.core module:
Made DNS functions no longer accept/return IP addresses in dots-and-numbers format. They work with packed IPs now.
Made DNS functions no longer accept additional arguments to pass to the callback.
Fixed DNS functions to check the return value of the libevent functions and raise
IOErrorif they failed.Added
core.dns_err_to_string().Made core.event.cancel not to raise if event_del reports an error. instead, the return code is passed to the caller.
Fixed minor issue in string representation of the events.
gevent.socket module:
Fixed bug in socket.accept. It could return unwrapped socket instance if socket’s timeout is 0.
Fixed socket.sendall implementation never to call underlying socket’s sendall.
Fixed
gethostbyname()andgetaddrinfo()to call the stdlib if the passed hostname has no dots.Fixed
getaddrinfo()to filter the results using socktype and proto arguments.Removed
getnameinfo()as it didn’t quite match the stdlib interface. Usedns.resolve_reverse()for reverse resolutions.Fixed
socket.connect_ex()to use cooperativegethostbyname().Fixed
socket.dup()not to call underlying socket’sdup()(which is not available on Windows) but to use Python’s reference counting similar to how the stdlib’s socket implementsdup()Added _sock argument to
socket’s constructor. Passing the socket instance as first argument is no longer supported.Fixed
socket.connect()to ignoreWSAEINVALon Windows.Fixed
socket.connect()to usewait_readwrite()instead ofwait_write().Fixed
socket.connect()to consultSO_ERROR.Fixed
socket.send()andsocket.sendall()to support flags argument.Renamed
socket_bind_and_listen()tosocket.bind_and_listen(). The old name is still available as a deprecated alias.The underlying socket object is now stored as
_sockproperty.Imported the constants and some utility functions from stdlib’s
socketintogevent.socket. (Thanks to Matt Goodall for the original patch).Renamed
wrap_ssl()tossl(). (the old name is still available but deprecated)Deprecated
connect_tcp()andtcp_server().Added
sslerrortosocket.__all__.Removed
GreenSocketalias for socket class.Moved PyOpenSSL-based implementation of
socket.ssl()intogevent.oldsslmodule. It’s imported intogevent.socketif importinggevent.sslfails.
Miscellaneous:
Fixed Greenlet.spawn_link* and GreenletSet.spawn_link* classmethods not to assume anything about their arguments. (Thanks to Marcus Cavanaugh for pointing that out).
Fixed
selectto clean up properly if event creation fails.Fixed
selectto raiseselect.errorinstead ofIOError.Fixed setup.py to proceed with compilation even if libevent version cannot be determined. 1.x.x is assumed in this case.
Fixed compatibility of .pyx files with Cython 0.12.0.
Renamed arguments for
select.select()to what they are called in the stdlib.Removed internal function
getLinkedCompleted()fromgevent.greenlet.Remove
#warningdirectives fromlibevent.h. They are not supported by vc90.Removed some deprecated stuff from
coros.Internal class
Waiternow stores the value if no one’s waiting for it.Added
testrunner.pyscript that replaces a bunch of small scripts that were used before.Removed
is_secureattribute from sockets and ssl objects.Made
Greenletnot to print a traceback when a not-yet-started greenlet is killed.Added
BackdoorServerclass tobackdoor. Removedbackdoor()function and deprecatedbackdoor_server()function.Removed
__getattr__from socket class.Fixed
monkey.patch_socket()not to fail ifsocket.ssl()is not present ingevent.socket.Added
monkey.patch_ssl().Added aggressive argument to
monkey.patch_all().Tests from stdlib no longer included in greentest package. Instead, there are number of stubs that import those tests from
testpackage directly and run them in monkey patched environment.Added examples/process.py by Marcus Cavanaugh.
Release 0.11.2 (Dec 10, 2009)¶
Fixed
wsgito unquoteenviron['PATH_INFO']before passing to application.Added
SERVER_SOFTWAREvariable towsgienviron.Fixed bug in
JoinableQueue.task_done()that causedValueErrorto be raised incorrectly here.Fixed
gevent.socketnot to fail withImportErrorif Python was not built with ssl support.
Release 0.11.1 (Nov 15, 2009)¶
Fixed bug in
select.select()function. Passing non-empty list of write descriptors used to cause this function to fail.Changed setup.py to go ahead with the compilation even if the actual version of libevent cannot be determined (version 1.x.x is assumed in that case).
Contributed by Ludvig Ericson:
Fixed
wsgi’sstart_responseto recognize exc_info argument.Fixed setup.py to look for libevent.dylib rather than .so on Darwin platforms.
Release 0.11.0 (Oct 9, 2009)¶
Fixed timeout bug in
joinall(),Greenlet.join(),pool.Pool.join(): if timeout has expired it used to raiseTimeout; now it returns silently.Fixed
signal()to run the signal handler in a new greenlet; it was run in theHubgreenlet before.Fixed
Timeout.start_new(): if passed aTimeoutinstance, it now calls itsstartmethod before returning it.Fixed
gevent.monkeyto patchthreading.localproperly.Fixed
Queue.empty()andQueue.full()to be compatible with the standardQueue. It tried to take into account the greenlets currently blocking onget/putwhich was not useful and hard to reason about. Now it simply comparesqsizeto maxsize, which what the standardQueuedoes too.Fixed
Eventto behave exactly like the standardthreading.Event:Event.set()does not accept a parameter anymore; it’s now either set or not.Event.getmethod is gone.Event.set(); Event.clear()used to be a no-op; now it properly wakes up all the waiters.AsyncResultbehaves exactly like before, but it does not inherit fromEventanymore and does missclear()method.
Renamed internal helpers
socket.wait_reader()/socket.wait_writer()tosocket.wait_read()/socket.wait_write().Renamed
gevent.socket.GreenSockettogevent.socket.socket.GreenSocketis still available as an alias but will be removed in the future.gevent.corenow includes wrappers for evbuffer, evdns, evhttp.Renamed the old
gevent.wsgitogevent.pywsgi.Added a new HTTP server
gevent.httpmodule based on libevent-http wrappers.Added a new WSGI server
gevent.wsgimodule based ongevent.http.Added evdns wrappers to
gevent.coreand DNS functions togevent.socketmodule. Contributed by Jason Toffaletti..Added a few a few options to
setup.pyto select a libevent library to compile against. Check them out withsetup.py -h.Added
__all__to many modules that missed it.Converted the docstrings and the changelog to sphinx/rst markup.
Added sphinx/rst documentation. It is available online at http://www.gevent.org.
Release 0.10.0 (Aug 26, 2009)¶
Changed
TimeoutAPI in a backward-incompatible way:Timeout.__init__()does not start the timer immediately anymore;Timeout.start()must be called explicitly. A shortcut -Timeout.start_new()- is provided that creates and starts aTimeout.Added
gevent.Greenletclass which is a subclass of greenlet that adds a few useful methodsjoin/get/kill/link.spawn()now returnsGreenletinstance. The oldspawn, which returnspy.magic.greenletinstance, can be still accessed asspawn_raw().Note
The implementation of
Greenletis an improvement onprocmodule, with these bugs fixed:Proc was not a subclass of greenlet which makes
getcurrent()useless and using Procs as keys in dict impossible.Proc executes links sequentially, so one could block the rest from being executed.
Greenletexecutes each link in a new greenlet by default, unless it is set up withGreenlet.rawlinkmethod.Proc cannot be easily subclassed. To subclass
Greenlet, override its _run and __init__ methods.
Added
pool.Poolclass with the methods compatible to the standardmultiprocessing.pool:apply,mapand others. It also hasspawnmethod which is always async and returns aGreenletinstance.Added
gevent.eventmodule with 2 classes:EventandAsyncResult.Eventis a drop-in replacement forthreading.Event, supportingset/wait/getmethods.AsyncResultis an extension ofEventthat supports exception passing viaset_exceptionmethod.Added
queue.JoinableQueueclass withtask_doneandjoinmethods.Renamed
core.readandcore.writeclasses tocore.read_eventandcore.write_event.gevent.pywsgi: pulled Mike Barton’s eventlet patches that fix double content-length issue.Fixed
setup.pyto search more places for system libevent installation. This fixes 64bit CentOS 5.3 installation issues, hopefully covers other platforms as well.
The following items were added to the gevent top level package:
spawn_link()spawn_link_value()spawn_link_exception()core
The following items were marked as deprecated:
gevent.proc module (
wrap_errorshelper was moved toutilmodule)gevent.coros.event
gevent.coros.Queue and gevent.coros.Channel
Internally, gevent.greenlet was split into a number of modules:
gevent.hubprovidesHubclass and basic utilities, likesleep();Hubis now a subclass of greenlet.gevent.timeoutprovidesTimeoutandwith_timeout();gevent.greenletprovidesGreenletclass and helpers likejoinall()andkillall().gevent.rawgreenletcontains the old “polling” versions ofjoinallandkillall(they do not needlinkfunctionality and work with any greenlet by polling their status and sleeping in a loop)
Thanks to Jason Toffaletti for reporting the installation issue and providing a test case for WSGI double content-length header bug.
Release 0.9.3 (Aug 3, 2009)¶
Fixed all known bugs in the
gevent.queuemodule and made it 2.4-compatible.LifoQueueandPriorityQueueare implemented as well.gevent.queuewill deprecate bothcoros.Queueandcoros.Channel.Fixed
Timeoutto raise itself by default.TimeoutErroris gone. Silent timeout is now created by passingFalseinstead ofNone.Fixed bug in
gevent.select.select()where it could silent the wrong timeout.spawn()andspawn_later()now avoid creating a closure and this decreases spawning time by 50%.kill’s andkillall’s wait argument was renamed to block. The polling is now implemented bygreenlet.joinandgreenlet.joinallfunctions and it become more responsive, with gradual increase of sleep time.Renamed
proc.RunningProcSettoproc.ProcSet.Added
shutdown()function, which blocks until libevent has finished dispatching the events.The return value of
event_addandevent_delin core.pyx are now checked properly andIOErroris raised if they have failed.Fixed backdoor.py, accidentally broken in the previous release.
Release 0.9.2 (Jul 20, 2009)¶
Simplified
gevent.socket’s implementation and fixed SSL bug reported on eventletdev by Cesar Alaniz as well as failures intest_socket_ssl.py.Removed
GreenSocket.makeGreenFile; Usesocket.socket.makefile()that returns_fileobjectand is available on bothGreenSocketandGreenSSL. Thegevent.socketis still a work in progress.Added new
core.active_eventclass that takes advantage of libevent’sevent_activefunction.core.active_event(func)schedules func to be run in this event loop iteration as opposed tocore.timer(0, ...)which schedules an event to be run in the next iteration.active_eventis now used throughout the library wherevercore.timer(0, ....)was previously used. This results inspawn()being at least 20% faster compared to release 0.9.1 and twice as fast compared to eventlet. (The results are obtained with bench_spawn.py script ingreentest/directory)Added boolean parameter wait to
kill()andkillall()functions. If set toTrue, it makes the function block until the greenlet(s) is actually dead. By default,kill()andkillall()are asynchronous, i.e. they don’t unschedule the current greenlet.Added a few new properties to
gevent.core.event:fd,events,events_strandflags. It also has__enter__and__exit__now, so it can be used as a context manager.event’scallbacksignature has changed from(event, fd, evtype)to(event, evtype).Fixed
Hub’s mainloop to never return successfully as this will screw up main greenlet’sswitch()call. Instead of returning it raisesDispatchExit.Added
reinit()function - wrapper for libevent’sevent_reinit. This function is a must have at least for daemons, as it fixesepolland some others eventloops to work afterfork.Trying to use gevent in another thread will now raise an exception immediately, since it’s not implemented.
Added a few more convenience methods
spawn_link[exception/value]toproc.RunningProcSet.Fixed
setup.pynot to depend onsetuptools.Removed
gevent.timeout. Usegevent.Timeout.
Release 0.9.1 (Jul 9, 2009)¶
Fixed compilation with libevent-1.3. Thanks to Litao Wei for reporting the problem.
Fixed
Hubto recover silently afterevent_dispatch()failures (I’ve seen this happen afterforkeven thoughevent_reinit()is called as necessary). The end result is thatfork()now works more reliably, as detected bytest_socketserver.py- it used to fail occasionally, now it does not.Reorganized the package, most of the stuff from
gevent/__init__.pywas moved togevent/greenlet.py.gevent/__init__.pyimports some of it back but not everything.Renamed
gevent.timeouttogevent.Timeout. The old name is available as an alias.Fixed a few bugs in
queue.Queue. Added test_queue.py from standard tests to check how good isqueue.Queuea replacement for a standardQueue(not good at all, timeouts inqueue.Queue.put()don’t work yet)monkeynow patches ssl module when on 2.6 (very limited support).Improved compatibility with Python 2.6 and Python 2.4.
Greenlet installed from PyPI (without py.magic prefix) is properly recognized now.
core.pyx was accidentally left out of the source package, it’s included now.
GreenSocketnow wraps asocketobject from_socketmodule rather than fromsocket.
Release 0.9.0 (Jul 8, 2009)¶
Started as eventlet 0.8.11 fork, with the intention to support only libevent as a backend. Compared to eventlet, this version has a much simpler API and implementation and a few severe bugs fixed, namely
Full duplex in sockets, i.e.
read()andwrite()on the same fd do not cancel one another.The
GreenSocket.closemethod does not hang as it could with eventlet.
There’s a test in my repo of eventlet that reproduces both of them: http://bitbucket.org/denis/eventlet/src/tip/greentest/test__socket.py
Besides having less bugs and less code to care about the goals of the fork are:
Piggy-back on libevent as much as possible (use its http and dns code).
Use the interfaces and conventions from the standard Python library where possible.