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.
Fixed issue #94: fallback to buffer if memoryview fails in _get_memory on python 2.7.
Fixed issue #103: Queue(None).full()
returns False
now (previously it returned True
).
Fixed issue #112: threading._sleep is not patched. Thanks to David LaBissoniere.
Fixed issue #115: _dummy gets unexpected Timeout arg.
Added __copy__
method to gevent.local.local
class that implements copy semantics compatible with built-in threading.local
. Patch by Galfy Pundee.
Fixed StreamServer
class to catch EWOULDBLOCK
rather than EAGAIN
. 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 calls event_reinit
only in the child process; otherwise the process could hang when using libevent2. Patch by Alexander Boudkar.
Fixed build problem on Python 2.5
Fixed TypeError
that occurred when environ["wsgi.input"].read
function was called with an integer argument.
Fixed issue #63: monkey.patch_thread()
now patches threading
too, even if it’s already imported. Patch by Shaun Lindsay.
Fixed issue #64: joinall()
and killall()
functions used to hang if their argument contained duplicate greenlets.
Fixed issue #69: pywsgi.WSGIServer
reported “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.WSGIServer
add REQUEST_URI
to environ. Patch by Andreas Blixt.
Fixed issue #71: monkey patching httplib
with gevent.httplib
used to break HTTPSConnection
. Patch by Nick Barkas.
Fixed issue #74: create_connection
now raises proper exception when getaddrinfo
fails.
Fixed BaseServer.__repr__()
method, BaseServer.server_host
and BaseServer.server_port
attributes to handle the case of AF_UNIX
addresses properly. Previously they assumed address is always a tuple.
Fixed pywsgi.WSGIServer
to handle AF_UNIX
listeners. The server now sets environ["SERVER_NAME"]
and environ["SERVER_PORT"]
to empty string in such case.
Make StreamServer
(and thus pywsgi.WSGIServer
) accept up to 100 connections per one readiness notification. This behaviour is controlled by StreamServer.max_accept
class attribute.
If bind fails, the servers now include the address that caused bind to fail in the error message.
Fixed typo in gevent.httplib
that rendered it unusable.
Removed unnecessary delay in getaddrinfo
by calling resolve_ipv4
and resolve_ipv6
concurrently rather than sequentially in AF_UNSPEC
case.
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.wsgi
with libevent2 (issue #62).
Fixed compilation issues with libevent2. Patch by Ralf Schmitt.
Fixed pywsgi
not 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 handle AF_UNSPEC
properly 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_info
set. 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 shutdown SSLSocket
properly, without raising SSLError(read operation timeout)
.
Fixed TypeError
inside Hub
on Python 2.4.
Made a number of internal improvements to gevent.pywsgi
to make subclassing easier.
Changed WSGIServer
to explicitly close the socket after the last request. Patch by Ralf Schmitt.
Fixed pywsgi.WSGIHandler
not to add CONTENT_TYPE
to the environ dict when there’s no Content-Type
header in the request. Previously a default text/plain
was added in such case.
Added proper implementation of imap_unordered
to Pool
class. 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 of Pool.imap_unordered()
.
Fixed BaseServer.started
property: it is now set to True
after start
until stop
or kill
. Previously it could become False
for short period of times, because StreamServer
could stop accepting for a while in presence of errors and StreamServer.started
was defined as “whether the server is currently accepting”.
Fixed wsgi.WSGIServer
to 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 to False
).
Added write
method to core.buffer
.
Fixed OverflowError
that could happen in core.event.__str__()
.
Made http_request.get_input_headers()
return header names in lower case.
Fixed StreamServer
to accept ciphers as an SSL argument.
Added build_exc --cython=
option to setup.py
. Patch by Ralf Schmitt.
Updated local
to raise AttributeError
if __dict__
attribute is set or deleted.
Release highlights:
Fixed monkey
to patch socket.create_connection
.
Updated gevent.ssl
module to fully match the functionality of ssl
on Python 2.7.
Fixed Group.join()
to handle raise_error=True
properly, it used to raise TypeError
(issue #36). Thanks to by David Hain.
Fixed gevent.wsgi
and gevent.pywsgi
to join multiple Cookie
headers (issue #40).
Fixed select
to recognize long
arguments in addition to int
.
Fixed Semaphore.acquire()
to return False
when timeout expires instead of raising AssertionError
(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.sslold
module.
gevent.socket
module:
Overrode socket.shutdown()
method to interrupt read/write operations on socket.
Fixed possible NameError
in socket.connect_ex()
method. Patch by Alexey Borzenkov.
Fixed socket leak in create_connection()
function.
Made gevent.socket
import all public items from stdlib socket
that 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()
in SSLSocket.__init__
, only silence exceptions caused by the “socket not connected” condition.
Added support for ciphers argument.
Updated SSLSocket.send
and SSLSocket.recv
methods to match the behavior of stdlib ssl
better.
Fixed ssl.SSLObject
to delete events used by other greenlets when closing the instance (issue #34).
Miscellaneous:
Made BaseServer
accept long
values as pool argument in addition to int
.
Made http._requests
attribute public.
Updated webchat example to use file on disk rather than in-memory sqlite database to avoid OperationalError
.
Fixed webproxy.py
example 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 BackdoorServer
close the connection on SystemExit
and simplified the code.
Made Pool
raise ValueError
when initialized with size=0
.
Updated setup.py --libevent
to configure and make libevent if it’s not built already.
Updated setup.py
to use setuptools
if present and add dependency on greenlet
.
Fixed doc/mysphinxext.py to work with Sphinx 1. Thanks by Örjan Persson.
Release highlights:
Added gevent.server
module with StreamServer
class for easy implementing of TCP and SSL servers.
Added gevent.baseserver
module with BaseServer
class.
Added new implementation of gevent.pywsgi
based on gevent.server
. Contributed by Ralf Schmitt.
Added gevent.local
module. Fixed issue #24. Thanks to Ted Suzman.
Fixed a number of bugs in gevent.wsgi
module.
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.wsgi
and gevent.pywsgi
much 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.HTTPServer
to match the interface of other servers.
Changed Pool
’s spawn()
method to block until there’s a free slot.
Removed deprecated backdoor.backdoor_server()
function.
Removed deprecated functions in socket
module:
socket_bind_and_listen()
set_reuse_addr()
connect_tcp()
tcp_server()
Removed deprecated socket.fd
property.
Deprecated use of negative numbers to indicate infinite timeout in core.event.add()
and socket.wait_read()
and similar. Use None
from now on, which is compatible with the previous versions.
Derived backdoor.BackdoorServer
from StreamServer
rather than from Greenlet
. This adds lots of new features and removes a few old ones.
Removed non-standard balance
property from Semaphore
.
Removed start()
, set_cb()
and set_gencb()
from core.http
.
Removed set_closecb()
from core.http_connection
. It is now used internally to detach the requests of the closed connections.
Deprecated rawgreenlet
module.
Deprecated util.lazy_property()
.
Renamed GreenletSet
to Group
. 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()
from socket
module.
The module now uses sys.platform
to detect Windows rather than platform
module.
Fixed issue #27: getaddrinfo()
used to handle the case when socktype or proto were equal to 0
. Thanks to Randall Leeds.
gevent.coros
module:
Added RLock
class.
Added DummySemaphore
class.
Fixed BoundedSemaphore
class to behave like threading.BoundedSemaphore
behaves.
gevent.event
module:
Made Event.wait()
return internal flag instead of None
.
Made AsyncResult.wait()
return its value
instead of None
.
Added ready()
method as an alias for is_set()
.
gevent.wsgi
module:
Removed wsgi.buffer_proxy
.
gevent.pywsgi
module:
Rewritten to use server
and not to depend on BaseHTTPServer
.
Changed the interface to match wsgi
module.
Removed server()
function, add Server
class, added WSGIServer
class.
Renamed HttpProtocol
to WSGIHandler
.
Fixed compatibility with webob by allowing an optional argument to readline()
.
gevent.core
module:
Fixed reference leaks in event
class.
Avoid Python name lookups when accessing EV_* constants from Cython code. Patch by Daniele Varrazzo.
Added persist argument to read_event
, write_event
and readwrite_event
.
Made all of the event loop callbacks clear the exception info before exiting.
Added flags_str
property to event
. It is used by __str__
and __repr__
.
buffer
:
Added detach()
method.
Implemented iterator protocol.
Fixed readline()
and readlines()
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_buffer
and output_buffer
store and reuse the buffer
object they create.
Fixed __str__()
and meth:__repr__
to include spaces where needed.
http
class no longer has set_cb()
and set_gencb()
. Instead its contructor accepts handle which will be called on each request.
gevent.http
and gevent.wsgi
modules:
Made HTTPServer
use "Connection: close"
header by default.
Class HTTPServer
now derives from baseserver.BaseServer
. Thus its start()
method no longer accepts socket to listen on, it must be passed to the contructor.
The spawn argument now accepts a Pool
instance. 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_request
which will send 500 reply when deallocated if the user hasn’t send any.
Miscellaneous:
Changed gevent.thread
to use Greenlet
instead of raw greenlets. This means monkey patched thread will become Greenlet
too.
Added started
property to Greenlet
.
Put common server code in gevent.baseserver
module. All servers in gevent package are now derived from BaseServer
.
Fixed issue #20: sleep()
now raises IOError
if 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 build gevent.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 backdoor
when a client typed quit()
.
If importing greenlet
failed 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 spawn Greenlet
instances, 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.
Fixed http server to put the listening socket into a non-blocking mode. Contributed by Ralf Schmitt.
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.so
to gevent/core.so
.
gevent.socket
: Improved compatibility with stdlib’s socket:
Release highlights:
Added gevent.ssl
module.
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_event
and socket.wait_readwrite()
functions.
Fixed several incompatibilities of wsgi
module with the WSGI spec.
Deprecated pywsgi
module.
gevent.wsgi
module:
Made env["REMOTE_PORT"]
into a string.
Fixed the server to close the iterator returned by the application.
Made wsgi.input
object 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
IOError
if 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()
and getaddrinfo()
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.
Use dns.resolve_reverse()
for reverse resolutions.
Fixed socket.connect_ex()
to use cooperative gethostbyname()
.
Fixed socket.dup()
not to call underlying socket’s dup()
(which is not available
on Windows) but to use Python’s reference counting similar to how the stdlib’s socket
implements dup()
Added _sock argument to socket
’s constructor. Passing the socket instance
as first argument is no longer supported.
Fixed socket.connect()
to ignore WSAEINVAL
on Windows.
Fixed socket.connect()
to use wait_readwrite()
instead of wait_write()
.
Fixed socket.connect()
to consult SO_ERROR
.
Fixed socket.send()
and socket.sendall()
to support flags argument.
Renamed socket_bind_and_listen()
to socket.bind_and_listen()
. The old name
is still available as a deprecated alias.
The underlying socket object is now stored as _sock
property.
Imported the constants and some utility functions from stdlib’s socket
into gevent.socket
.
(Thanks to Matt Goodall for the original patch).
Renamed wrap_ssl()
to ssl()
. (the old name is still available but deprecated)
Deprecated connect_tcp()
and tcp_server()
.
Added sslerror
to socket.__all__
.
Removed GreenSocket
alias for socket class.
Moved PyOpenSSL-based implementation of socket.ssl()
into gevent.oldssl
module.
It’s imported into gevent.socket
if importing gevent.ssl
fails.
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 select
to clean up properly if event creation fails.
Fixed select
to raise select.error
instead of IOError
.
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()
from gevent.greenlet
.
Remove #warning
directives from libevent.h
. They are not supported by vc90.
Removed some deprecated stuff from coros
.
Internal class Waiter
now stores the value if no one’s waiting for it.
Added testrunner.py
script that replaces a bunch of small scripts that were used before.
Removed is_secure
attribute from sockets and ssl objects.
Made Greenlet
not to print a traceback when a not-yet-started greenlet is killed.
Added BackdoorServer
class to backdoor
. Removed backdoor()
function and deprecated backdoor_server()
function.
Removed __getattr__
from socket class.
Fixed monkey.patch_socket()
not to fail if socket.ssl()
is not present in gevent.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 test
package directly and run them in monkey patched environment.
Added examples/process.py by Marcus Cavanaugh.
Fixed wsgi
to unquote environ['PATH_INFO']
before passing to application.
Added SERVER_SOFTWARE
variable to wsgi
environ.
Fixed bug in JoinableQueue.task_done()
that caused ValueError
to be raised incorrectly here.
Fixed gevent.socket
not to fail with ImportError
if Python was not built with ssl support.
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
’s start_response
to recognize exc_info argument.
Fixed setup.py to look for libevent.dylib rather than .so on Darwin platforms.
Fixed timeout bug in joinall()
, Greenlet.join()
, pool.Pool.join()
: if timeout has expired
it used to raise Timeout
; now it returns silently.
Fixed signal()
to run the signal handler in a new greenlet; it was run in the Hub
greenlet before.
Fixed Timeout.start_new()
: if passed a Timeout
instance, it now calls its start
method before returning it.
Fixed gevent.monkey
to patch threading.local
properly.
Fixed Queue.empty()
and Queue.full()
to be compatible
with the standard Queue
. It tried to take into account the greenlets currently blocking on
get
/put
which
was not useful and hard to reason about. Now it simply compares qsize
to maxsize,
which what the standard Queue
does too.
Fixed Event
to behave exactly like the standard threading.Event
:
Event.set()
does not accept a parameter anymore; it’s now either set or not.
Event.get
method is gone.
Event.set(); Event.clear()
used to be a no-op; now it properly wakes up all the waiters.
AsyncResult
behaves exactly like before, but it does not inherit from Event
anymore
and does miss clear()
method.
Renamed internal helpers socket.wait_reader()
/socket.wait_writer()
to socket.wait_read()
/socket.wait_write()
.
Renamed gevent.socket.GreenSocket
to gevent.socket.socket
. GreenSocket
is still available
as an alias but will be removed in the future.
gevent.core
now includes wrappers for evbuffer, evdns, evhttp.
Renamed the old gevent.wsgi
to gevent.pywsgi
.
Added a new HTTP server gevent.http
module based on libevent-http wrappers.
Added a new WSGI server gevent.wsgi
module based on gevent.http
.
Added evdns wrappers to gevent.core
and DNS functions to gevent.socket
module. Contributed by Jason Toffaletti..
Added a few a few options to setup.py
to select a libevent library to compile against. Check them out with setup.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.
Changed Timeout
API 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
a Timeout
.
Added gevent.Greenlet
class which is a subclass of greenlet that adds a few
useful methods join
/get
/kill
/link
.
spawn()
now returns Greenlet
instance. The old spawn
, which returns py.magic.greenlet
instance, can be still accessed as spawn_raw()
.
Note
The implementation of Greenlet
is an improvement on proc
module, 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. Greenlet
executes each link in a new greenlet by default, unless
it is set up with Greenlet.rawlink
method.
Proc cannot be easily subclassed. To subclass Greenlet
, override its _run
and __init__ methods.
Added pool.Pool
class with the methods compatible to the standard multiprocessing.pool
:
apply
, map
and others.
It also has spawn
method which is always async and returns a
Greenlet
instance.
Added gevent.event
module with 2 classes: Event
and AsyncResult
.
Event
is a drop-in replacement for threading.Event
, supporting
set
/wait
/get
methods. AsyncResult
is an extension of Event
that supports exception passing via set_exception
method.
Added queue.JoinableQueue
class with task_done
and join
methods.
Renamed core.read
and core.write
classes to core.read_event
and core.write_event
.
gevent.pywsgi
: pulled Mike Barton’s eventlet patches that fix double content-length issue.
Fixed setup.py
to 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_errors
helper was moved to util
module)
gevent.coros.event
gevent.coros.Queue and gevent.coros.Channel
Internally, gevent.greenlet
was split into a number of modules:
gevent.hub
provides Hub
class and basic utilities, like sleep()
;
Hub
is now a subclass of greenlet.
gevent.timeout
provides Timeout
and with_timeout()
;
gevent.greenlet
provides Greenlet
class and helpers like joinall()
and killall()
.
gevent.rawgreenlet
contains the old “polling” versions of
joinall
and killall
(they do not need link
functionality 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.
Fixed all known bugs in the gevent.queue
module and made it 2.4-compatible.
LifoQueue
and PriorityQueue
are implemented as well.
gevent.queue
will deprecate both coros.Queue
and coros.Channel
.
Fixed Timeout
to raise itself by default. TimeoutError
is gone.
Silent timeout is now created by passing False
instead of None
.
Fixed bug in gevent.select.select()
where it could silent the wrong timeout.
spawn()
and spawn_later()
now avoid creating a closure and this decreases spawning
time by 50%.
kill
’s and killall
’s wait argument was renamed to block. The polling is now
implemented by greenlet.join
and greenlet.joinall
functions and it become more
responsive, with gradual increase of sleep time.
Renamed proc.RunningProcSet
to proc.ProcSet
.
Added shutdown()
function, which blocks until libevent has finished dispatching the events.
The return value of event_add
and event_del
in core.pyx are now checked properly
and IOError
is raised if they have failed.
Fixed backdoor.py, accidentally broken in the previous release.
Simplified gevent.socket
’s implementation and fixed SSL bug reported on eventletdev
by Cesar Alaniz as well as failures in test_socket_ssl.py
.
Removed GreenSocket.makeGreenFile
; Use socket.socket.makefile()
that returns _fileobject
and is available on both GreenSocket
and GreenSSL
.
The gevent.socket
is still a work in progress.
Added new core.active_event
class that takes advantage of libevent’s event_active
function.
core.active_event(func)
schedules func to be run in this event loop iteration as opposed
to core.timer(0, ...)
which schedules an event to be run in the next iteration.
active_event
is now used throughout the library wherever core.timer(0, ....)
was previously used.
This results in spawn()
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 in greentest/
directory)
Added boolean parameter wait to kill()
and killall()
functions. If set to True
, it makes the
function block until the greenlet(s) is actually dead. By default, kill()
and killall()
are asynchronous,
i.e. they don’t unschedule the current greenlet.
Added a few new properties to gevent.core.event
: fd
, events
,
events_str
and flags
. It also has __enter__
and __exit__
now, so it can be used as a context
manager. event
’s callback
signature has changed from (event, fd, evtype)
to (event, evtype)
.
Fixed Hub
’s mainloop to never return successfully as this will screw up main greenlet’s switch()
call.
Instead of returning it raises DispatchExit
.
Added reinit()
function - wrapper for libevent’s event_reinit
.
This function is a must have at least for daemons, as it fixes epoll
and some others eventloops to work after fork
.
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]
to proc.RunningProcSet
.
Fixed setup.py
not to depend on setuptools
.
Removed gevent.timeout
. Use gevent.Timeout
.
Fixed compilation with libevent-1.3. Thanks to Litao Wei for reporting the problem.
Fixed Hub
to recover silently after event_dispatch()
failures (I’ve seen this
happen after fork
even though event_reinit()
is called as necessary). The end result is that fork()
now works more reliably, as detected by test_socketserver.py
- it used to fail occasionally, now it does not.
Reorganized the package, most of the stuff from gevent/__init__.py
was moved to gevent/greenlet.py
.
gevent/__init__.py
imports some of it back but not everything.
Renamed gevent.timeout
to gevent.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 is queue.Queue
a replacement
for a standard Queue
(not good at all, timeouts in queue.Queue.put()
don’t work yet)
monkey
now 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.
GreenSocket
now wraps a socket
object from _socket
module rather
than from socket
.
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()
and write()
on the same fd do not cancel one another.
The GreenSocket.close
method 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.
Next page: Introduction