gevent
- TBD
- CI services now test on 3.6.0.
- Windows: Provide
socket.socketpair
for all Python 3 versions. This was added to Python 3.5, but tests were only added in 3.6. (For versions older than 3.4 this is a gevent extension.) Previously this was not supported on any Python 3 version. - Windows: List
subprocess.STARTUPINFO
insubprocess.__all__
for 3.6 compatibility. - The
_DummyThread
objects created by callingthreading.current_thread
from inside a rawgreenlet.greenlet
in a system with monkey-patchedthreading
now clean up after themselves when the greenlet dies (gevent.Greenlet
-based_DummyThreads
have always cleaned up). This requires the use of aweakref.ref
(and may not be timely on PyPy). Reported in918
by frozenoctobeer. - Build OS X wheels with
-D_DARWIN_FEATURE_CLOCK_GETTIME=0
for compatibility with OS X releases before 10.12 Sierra. Reported by Ned Batchelder in916
.
- The c-ares DNS resolver ignores bad flags to getnameinfo, like the system resolver does. Discovered when cleaning up the DNS resolver tests to produce more reliable results. See
774
.
- Update libev to version 4.23.
- Allow the
MAKE
environment variable to specify the make command on non-Windows systems for ease of development on BSD systems wheremake
is BSD make andgmake
is GNU make (gevent requires GNU make). See888
. - Let
gevent.server.StreamServer
accept anSSLContext
on Python versions that support it. Added in904
by Arcadiy Ivanov.
- Support for Python 2.6 has been removed. See
766
. - Remove module
gevent.coros
which was replaced bygevent.lock
and has been deprecated since 1.0b2. - The internal implementation modules
gevent.corecext
andgevent.corecffi
have been moved. Please import fromgevent.core
instead; this has always been the only documented place to import from.
- Update libev to version 4.22 (was 4.20).
- Update tblib to 1.3.0.
- Update Cython to 0.25 (was 0.23.5).
- Update c-ares to version 1.12.0 (was 1.10.0) (release notes).
- For the benefit of downstream package maintainers, gevent is now tested with c-ares and libev linked dynamically and not embedded (i.e., using the system libraries). However, only the versions shipped with gevent are tested and known to work.
- The repository directory layout has been changed to make it easier to include third-party dependencies. Likewise, the setup.py script has been split to make it easier to build third-party dependencies.
- PyPy/CFFI: The corecffi native extension is now only built at installation time. Previously, if it wasn't available, a build was attempted at every import. This could lead to scattered "gevent" directories and undependable results.
- setuptools is now required at build time on all platforms. Previously it was only required for Windows and PyPy.
- POSIX: Don't hardcode
/bin/sh
into the configuration command line, instead relying onsh
being on thePATH
, as recommended by the standard. Fixed in809
by Fredrix Fornwall.
gevent.pywsgi
now checks that the values passed tostart_response
do not contain a carriage return or newline in order to prevent HTTP response splitting (header injection), raising aValueError
if they do. See775
.- Incoming headers containing an underscore are no longer placed in the WSGI environ. See
819
. - Errors logged by
~gevent.pywsgi.WSGIHandler
no longer print the entire WSGI environment by default. This avoids possible information disclosure vulnerabilities. Applications can also opt-in to a higher security level for the WSGI environment if they choose and their frameworks support it. Originally reported in779
by sean-peters-au and changed in781
.
- As mentioned above, Python 2.6 is no longer supported.
- Python 3.6 is now tested on POSIX platforms. This includes a few notable changes:
- SSLContext.wrap_socket accepts the
session
parameter, though this parameter isn't useful prior to 3.6. - SSLSocket.recv(0) or read(0) returns an empty byte string. This is a fix for Python bug #23804 which has also been merged into Python 2.7 and Python 3.5.
- SSLContext.wrap_socket accepts the
- PyPy3 5.5.0 alpha (supporting Python 3.3.5) is now tested and passes the test suite. Thanks to btegs for
866
, and Fabio Utzig for826
. Note that PyPy3 is not optimized for performance either by the PyPy developers or under gevent, so it may be significantly slower than PyPy2.
- The modules
gevent.os
,gevent.signal
andgevent.select
export all the attributes from their corresponding standard library counterpart. - Python 2:
reload(site)
no longer fails with aTypeError
if gevent has been imported. Reported in805
by Jake Hilton. - Python 2:
sendall
on a non-blocking socket could spuriously fail with a timeout.
- If
gevent.select.select
is given a negative timeout argument, raise an exception like the standard library does. - If
gevent.select.select
is given closed or invalid file descriptors in any of its lists, raise the appropriateEBADF
exception like the standard library does. Previously, libev would tend to return the descriptor as ready. In the worst case, this adds an extra system call, but may also reduce latency if descriptors are ready at the time of entry. selectors.SelectSelector
is properly monkey-patched regardless of the order of imports. Reported in835
by Przemysław Węgrzyn.gevent.select.poll.unregister
raises an exception if fd is not registered, like the standard library.gevent.select.poll.poll
returns an event withPOLLNVAL
for registered fds that are invalid. Previously it would tend to report both read and write events.
FileObjectPosix
exposes theread1
method when in read mode, and generally only exposes methods appropriate to the mode it is in.FileObjectPosix
supports a bufsize of 0 in binary write modes. Reported in840
by Mike Lang.- Python 3:
gevent.socket.connect_ex
was lettingBlockingIOError
(and possibly others) get raised instead of returning the errno due to the refactoring of the exception hierarchy in Python 3.3. Now the errno is returned. Reported in841
by Dana Powers.
~.Group
and~.Pool
now return whether~.Group.join
returned with an empty group. Suggested by Filippo Sironi in503
.- Unhandled exception reports that kill a greenlet now include a timestamp. See
137
. ~.PriorityQueue
now ensures that an initial items list is a valid heap. Fixed in793
by X.C.Dong.gevent.hub.signal
(akagevent.signal
) now verifies that its handler argument is callable, raising aTypeError
if it isn't. Reported in818
by Peter Renström.- If
sys.stderr
has been monkey-patched (not recommended), exceptions that the hub reports aren't lost and can still be caught. Reported in825
by Jelle Smet. - The
gevent.os.waitpid
function is cooperative in more circumstances. Reported in878
by Heungsub Lee. - The various
FileObject
implementations are more consistent with each other. Note: Writing to the io property of a FileObject should be considered deprecated. - Timeout exceptions (and other asynchronous exceptions) could cause the BackdoorServer to fail to properly manage the stdout/stderr/stdin values. Reported with a patch in
874
by stefanmh. - The BackDoorServer now tracks spawned greenlets (connections) and kills them in its
stop
method.
- Default to AF_INET6 when binding to all addresses (e.g., ""). This supports both IPv4 and IPv6 connections (except on Windows). Original change in
495
by Felix Kaiser. - pywsgi/performance: Chunks of data the application returns are no longer copied before being sent to the socket when the transfer-encoding is chunked, potentially reducing overhead for large responses.
- Add
gevent.threadpool.ThreadPoolExecutor
(aconcurrent.futures.ThreadPoolExecutor
variant that always uses native threads even when the system has been monkey-patched) on platforms that haveconcurrent.futures
available (Python 3 and Python 2 with thefutures
backport installed). This is helpful for, e.g., grpc. Reported in786
by Markus Padourek. - Native threads created before monkey-patching threading can now be joined. Previously on Python < 3.4, doing so would raise a
LoopExit
error. Reported in747
by Sergey Vasilyev.
- On Python 2.7.9 and above (more generally, when the SSL backport is present in Python 2),
gevent.ssl.get_server_certificate
would raise aValueError
if the system wasn't monkey-patched. Reported in801
by Gleb Dubovik. - On Python 2.7.9 and Python 3, closing an SSL socket in one greenlet while it's being read from or written to in a different greenlet is less likely to raise a
TypeError
instead of aValueError
. Reported in800
by Kevin Chen.
- Setting SIGCHLD to SIG_IGN or SIG_DFL after
gevent.subprocess
had been used previously could not be reversed, causingPopen.wait
and other calls to hang. Now, if SIGCHLD has been ignored, the next timegevent.subprocess
is used this will be detected and corrected automatically. (This potentially leads to issues withos.popen
on Python 2, but the signal can always be reset again. Mixing the low-level process handling calls, low-level signal management and high-level use ofgevent.subprocess
is tricky.) Reported in857
by Chris Utz. Popen.kill
andsend_signal
no longer attempt to send signals to processes that are known to be exited.
Several backwards compatible updates to the subprocess module have been backported from Python 3 to Python 2, making gevent.subprocess
smaller, easier to maintain and in some cases safer.
- Popen objects can be used as context managers even on Python 2. The high-level API functions (
call
, etc) use this for added safety. - The
gevent.subprocess
module now provides thegevent.subprocess.run
function in a cooperative way even when the system is not monkey patched, on all supported versions of Python. (It was added officially in Python 3.5.) - Popen objects save their args attribute even on Python 2.
gevent.subprocess.TimeoutExpired
is defined even on Python 2, where it is a subclass of thegevent.timeout.Timeout
exception; all instances where aTimeout
exception would previously be thrown under Python 2 will now throw aTimeoutExpired
exception.gevent.subprocess.call
(andcheck_call
) accepts the timeout keyword argument on Python 2. This is standard on Python 3, but a gevent extension on Python 2.gevent.subprocess.check_output
accepts the timeout and input arguments on Python 2. This is standard on Python 3, but a gevent extension on Python 2.
- Python 2:
sendall
on a non-blocking socket could spuriously fail with a timeout. - If
sys.stderr
has been monkey-patched (not recommended), exceptions that the hub reports aren't lost and can still be caught. Reported in825
by Jelle Smet. selectors.SelectSelector
is properly monkey-patched regardless of the order of imports. Reported in835
by Przemysław Węgrzyn.- Python 2:
reload(site)
no longer fails with aTypeError
if gevent has been imported. Reported in805
by Jake Hilton.
- Nested callbacks that set and clear an Event no longer cause
wait
to return prematurely. Reported in771
by Sergey Vasilyev. - Fix build on Solaris 10. Reported in
777
by wiggin15. - The
ref
parameter togevent.os.fork_and_watch
was being ignored. - Python 3:
gevent.queue.Channel
is now correctly iterable, instead of raising aTypeError
. - Python 3: Add support for
socket.socket.sendmsg
,socket.socket.recvmsg
andsocket.socket.recvmsg_into
on platforms where they are defined. Initial773
by Jakub Klama.
- Python 3: A monkey-patched
threading.RLock
now properly blocks (or deadlocks) inacquire
if the default value for timeout of -1 is used (which differs from gevent's default of None). Theacquire
method also raises the sameValueError
exceptions that the standard library does for invalid parameters. Reported in750
by Joy Zheng. - Fix a race condition in
~gevent.event.Event
that made it returnFalse
when the event was set and cleared by the same greenlet before allowing a switch to already waiting greenlets. (Found by the 3.4 and 3.5 standard library test suites; the same as Python bug 13502. Note that the Python 2 standard library still has this race condition.) ~gevent.event.Event
and~.AsyncResult
now wake waiting greenlets in the same (unspecified) order. Previously,AsyncResult
tended to use a FIFO order, but this was never guaranteed. Both classes also use less per-instance memory.- Using a
~logging.Logger
as apywsgi
error or request log stream no longer produces extra newlines. Reported in756
by ael-code. - Windows: Installing from an sdist (.tar.gz) on PyPI no longer requires having Cython installed first. (Note that the binary installation formats (wheels, exes, msis) are preferred on Windows.) Reported in
757
by Ned Batchelder. - Issue a warning when
~gevent.monkey.patch_all
is called withos
set to False (not the default) butsignal
is still True (the default). This combination of parameters will cause signal handlers forSIGCHLD
to not get called. In the future this might raise an error. Reported by Josh Zuech. - Issue a warning when
~gevent.monkey.patch_all
is called more than once with different arguments. That causes the cumulative set of all True arguments to be patched, which may cause unexpected results. - Fix returning the original values of certain
threading
attributes fromgevent.monkey.get_original
.
- SSL: Attempting to send empty data using the
~socket.socket.sendall
method of a gevent SSL socket that has a timeout now returns immediately (like the standard library does), instead of incorrectly raisingssl.SSLEOFError
. (Note that sending empty data with the~socket.socket.send
method does raiseSSLEOFError
in both gevent and the standard library.) Reported in719
by Mustafa Atik and Tymur Maryokhin, with a reproducible test case provided by Timo Savola.
- Python 2: Using the blocking API at import time when multiple greenlets are also importing should not lead to
LoopExit
. Reported in728
by Garrett Heel. - Python 2: Don't raise
OverflowError
when using thereadline
method of the WSGI input stream without a size hint or with a large size hint when the client is uploading a large amount of data. (This only impacted CPython 2; PyPy and Python 3 already handled this.) Reported in289
by ggjjlldd, with contributions by Nathan Hoad. ~gevent.baseserver.BaseServer
and its subclasses like~gevent.pywsgi.WSGIServer
avoid allocating a new closure for each request, reducing overhead.- Python 2: Under 2.7.9 and above (or when the PEP 466 SSL interfaces are available), perform the same hostname validation that the standard library does; previously this was skipped. Also, reading, writing, or handshaking a closed
~ssl.SSLSocket
now raises the sameValueError
the standard library does, instead of anAttributeError
. Found by updating gevent's copy of the standard library test cases. Initially reported in735
by Dmitrij D. Czarkoff. - Python 3: Fix
~ssl.SSLSocket.unwrap
and SNI callbacks. Also raise the correct exceptions for unconnected SSL sockets and properly validate SSL hostnames. Found via updated standard library tests. - Python 3: Add missing support for
socket.socket.sendfile
. Found via updated standard library tests. - Python 3.4+: Add missing support for
socket.socket.get_inheritable
and~socket.socket.set_inheritable
. Found via updated standard library tests.
- Python 2: Support the new PEP 466
ssl
interfaces on any Python 2 version that supplies them, not just on the versions it officially shipped with. Some Linux distributions, including RedHat/CentOS and Amazon have backported the changes to older versions. Reported in702
. - PyPy: An interaction between Cython compiled code and the garbage collector caused PyPy to crash when a previously-allocated Semaphore was used in a
__del__
method, something done in the popular librariesrequests
andurllib3
. Due to this and other Cython related issues, the Semaphore class is no longer compiled by Cython on PyPy. This means that it is now traceable and not exactly as atomic as the Cython version, though the overall semantics should remain the same. Reported in704
by Shaun Crampton. - PyPy: Optimize the CFFI backend to use less memory (two pointers per watcher).
- Python 3: The WSGI
PATH_INFO
entry is decoded from URL escapes using latin-1, not UTF-8. This improves compliance with PEP 3333 and compatibility with some frameworks like Django. Fixed in712
by Ruben De Visscher.
- Exceptions raised by gevent's SSL sockets are more consistent with the standard library (e.g., gevent's Python 3 SSL sockets raise
socket.timeout
instead ofssl.SSLError
, a change introduced in Python 3.2). - Python 2: gevent's socket's
sendall
method could completely ignore timeouts in some cases. The timeout now refers to the total time taken bysendall
. - gevent's SSL socket's
sendall
method should no longer raiseSSL3_WRITE_PENDING
in rare cases when sending large buffers. Reported in317
. gevent.signal.signal
now allows resetting (SIG_DFL) and ignoring (SIG_IGN) the SIGCHLD signal at the process level (although this may allow race conditions with libev child watchers). Reported in696
by Adam Ning.gevent.spawn_raw
now accepts keyword arguments, as previously (incorrectly) documented. Reported in680
by Ron Rothman.- PyPy: PyPy 2.6.1 or later is now required (4.0.1 or later is recommended).
- The CFFI backend is now built and usable on CPython implementations (except on Windows) if
cffi
is installed before gevent is installed. To use the CFFI backend, set the environment variableGEVENT_CORE_CFFI_ONLY
before starting Python. This can aid debugging in some cases and helps ensure parity across all combinations of supported platforms. - The CFFI backend now calls the callback of a watcher whose
args
attribute is set toNone
, just like the Cython backend does. It also only allowsargs
to be a tuple orNone
, again matching the Cython backend. - PyPy/CFFI: Fix a potential crash when using stat watchers.
- PyPy/CFFI: Encode unicode paths for stat watchers using
sys.getfilesystemencoding
like the Cython backend. - The internal implementation modules
gevent._fileobject2
,gevent._fileobject3
, andgevent._util
were removed. These haven't been used or tested since 1.1b1.
- Windows/Python 3: Finish porting the
gevent.subprocess
module, fixing a large number of failing tests. Examples of failures are in668
and669
reported by srossross. - Python 3: The SSLSocket class should return an empty
bytes
object on an EOF instead of astr
. Fixed in674
by Dahoon Kim. - Python 2: Workaround a buffering bug in the stdlib
io
module that causedFileObjectPosix
to be slower than necessary in some cases. Reported in675
by WGH-. PyPy: Fix a crash. Reported in
676
by Jay Oster.Caution
There are some remaining, relatively rare, PyPy crashes, but their ultimate cause is unknown (gevent, CFFI, greenlet, the PyPy GC?). PyPy users can contribute to
677
to help track them down.- PyPy: Exceptions raised while handling an error raised by a loop callback function behave like the CPython implementation: the exception is printed, and the rest of the callbacks continue processing.
- If a Hub object with active watchers was destroyed and then another one created for the same thread, which itself was then destroyed with
destroy_loop=True
, the process could crash. Documented in237
and fix based on238
, both by Jan-Philip Gehrcke. - Python 3: Initializing gevent's hub for the first time simultaneously in multiple native background threads could fail with
AttributeError
andImportError
. Reported in687
by Gregory Petukhov.
- PyPy: Fix a memory leak for code that allocated and disposed of many
gevent.lock.Semaphore
subclasses. If monkey-patched, this could also apply tothreading.Semaphore
objects. Reported in660
by Jay Oster. - PyPy: Cython version 0.23.4 or later must be used to avoid a memory leak (details). Thanks to Jay Oster.
- Allow subclasses of
~.WSGIHandler
to handle invalid HTTP client requests. Reported by not-bob. ~.WSGIServer
more robustly supports~logging.Logger
-like parameters forlog
anderror_log
(as introduced in 1.1b1, this could cause integration issues with gunicorn). Reported in663
by Jay Oster.~gevent.threading._DummyThread
objects, created in a monkey-patched system whenthreading.current_thread
is called in a new greenlet (which often happens implicitly, such as when logging) are much lighter weight. For example, they no longer allocate and then delete a~gevent.lock.Semaphore
, which is especially important for PyPy.- Request logging by
gevent.pywsgi
formats the status code correctly on Python 3. Reported in664
by Kevin Chen. - Restore the ability to take a weak reference to instances of exactly
gevent.lock.Semaphore
, which was unintentionally removed as part of makingSemaphore
atomic on PyPy on 1.1b1. Reported in666
by Ivan-Zhu. - Build Windows wheels for Python 3.5. Reported in
665
by Hexchain Tong.
gevent.subprocess
works under Python 3.5. In general, Python 3.5 has preliminary support. Reported in653
by Squeaky.Popen.communicate <gevent.subprocess.Popen.communicate>
honors atimeout
argument even if there is no way to communicate with the child process (none of stdin, stdout and stderr were set toPIPE
). Noticed as part of the Python 3.5 test suite for the new functionsubprocess.run
but impacts all versions (timeout
is an official argument under Python 3 and a gevent extension with slightly different semantics under Python 2).- Fix a possible
ValueError
fromQueue.peek <gevent.queue.Queue.peek>
. Reported in647
by Kevin Chen. - Restore backwards compatibility for using
gevent.signal
as a callable, which, depending on the order of imports, could be broken after the addition of thegevent.signal
module. Reported in648
by Sylvain Zimmer. - gevent blocking operations performed at the top-level of a module after the system was monkey-patched under Python 2 could result in raising a
~gevent.hub.LoopExit
instead of completing the expected blocking operation. Note that performing gevent blocking operations in the top-level of a module is typically not recommended, but this situation can arise when monkey-patching existing scripts. Reported in651
and652
by Mike Kaplinskiy. SIGCHLD
andwaitpid
now work for the pids returned by the (monkey-patched)os.forkpty
andpty.fork
functions in the same way they do for theos.fork
function. Reported in650
by Erich Heine.~gevent.pywsgi.WSGIServer
and~gevent.pywsgi.WSGIHandler
do a better job detecting and reporting potential encoding errors for headers and the status line during~gevent.pywsgi.WSGIHandler.start_response
as recommended by the WSGI specification. In addition, under Python 2, unnecessary encodings and decodings (often a trip through the ASCII encoding) are avoided for conforming applications. This is an enhancement of an already documented and partially enforced constraint: beginning in 1.1a1, under Python 2,u'abc'
would typically previously have been allowed, butu'\u1f4a3'
would not; now, neither will be allowed, more closely matching the specification, improving debugability and performance and allowing for better error handling both by the application and by gevent (previously, certain encoding errors could result in gevent writing invalid/malformed HTTP responses). Reported by Greg Higgins and Carlos Sanchez.- Code coverage by tests is now reported on coveralls.io.
- Detect and raise an error for several important types of programming errors even if Python interpreter optimizations are enabled with
-O
orPYTHONOPTIMIZE
. Previously these would go undetected if optimizations were enabled, potentially leading to erratic, difficult to debug behaviour. - Fix an
AttributeError
fromgevent.queue.Queue
whenpeek
was called on an emptyQueue
. Reported in643
by michaelvol. - Make
SIGCHLD
handlers specified togevent.signal.signal
work with the child watchers that are used by default. Also makegevent.os.waitpid
work with a first argument of -1. (Also applies to the corresponding monkey-patched stdlib functions.) Noted by users of gunicorn. - Under Python 2, any timeout set on a socket would be ignored when using the results of
socket.makefile
. Reported in644
by Karan Lyons.
- Fix an
AttributeError
fromgevent.monkey.patch_builtins
on Python 2 when the future library is also installed. Reported by Carlos Sanchez. - PyPy: Fix a
DistutilsModuleError
orImportError
if the CFFI module backinggevent.core
needs to be compiled when the hub is initialized (due to a missing or invalid__pycache__
directory). Now, the module will be automtically compiled when gevent is imported (this may produce compiler output on stdout). Reported in619
by Thinh Nguyen and631
by Andy Freeland, with contributions by Jay Oster and Matt Dupre. - PyPy: Improve the performance of
gevent.socket.socket:sendall
with large inputs. bench_sendall.py now performs about as well on PyPy as it does on CPython, an improvement of 10x (from ~60MB/s to ~630MB/s). See this pypy bug for details. - Fix a possible
TypeError
when callinggevent.socket.wait
. Reported in #635 by lanstin. gevent.socket.socket:sendto
properly respects the socket's blocking status (meaning it can raise EWOULDBLOCK now in cases it wouldn't have before). Reported in634
by Mike Kaplinskiy.- Common lookup errors using the
threaded resolver <gevent.resolver_thread>
are no longer always printed to stderr since they are usually out of the programmer's control and caught explicitly. (Programming errors likeTypeError
are still printed.) Reported in617
by Jay Oster and Carlos Sanchez. - PyPy: Fix a
TypeError
fromgevent.idle()
. Reported in639
by chilun2008. - The
~gevent.pool.Pool.imap_unordered
methods of a pool-like object support amaxsize
parameter to limit the number of results buffered waiting for the consumer. Reported in638
by Sylvain Zimmer. - The class
gevent.queue.Queue
now consistently orders multiple blocked waitingput
andget
callers in the order they arrived. Previously, due to an implementation quirk this was often roughly the case under CPython, but not under PyPy. Now they both behave the same. - The class
gevent.queue.Queue
now supports thelen
function.
- Enable using the
c-ares resolver <gevent.resolver_ares>
under PyPy. Note that its performance characteristics are probably sub-optimal. - On some versions of PyPy on some platforms (notably 2.6.0 on 64-bit Linux), enabling
gevent.monkey.patch_builtins
could cause PyPy to crash. Reported in618
by Jay Oster. gevent.kill
raises the correct exception in the target greenlet. Reported in623
by Jonathan Kamens.- Various fixes on Windows. Reported in
625
,627
, and628
by jacekt and Yuanteng (Jeff) Pei. Fixed in624
. - Add
~gevent.fileobject.FileObjectPosix.readable
and~gevent.fileobject.FileObjectPosix.writable
methods to~gevent.fileobject.FileObjectPosix
; this fixes e.g., help() on Python 3 when monkey-patched.
setup.py
can be run from a directory containing spaces. Reported in319
by Ivan Smirnov.setup.py
can build with newer versions of clang on OS X. They enforce the distinction between CFLAGS and CPPFLAGS.gevent.lock.Semaphore
is atomic on PyPy, just like it is on CPython. This comes at a small performance cost on PyPy.- Fixed regression that failed to set the
successful
value to False when killing a greenlet before it ran with a non-default exception. Fixed in608
by Heungsub Lee. - libev's child watchers caused
os.waitpid
to become unreliable due to the use of signals on POSIX platforms. This was especially noticeable when usinggevent.subprocess
in combination withmultiprocessing
. Now, the monkey-patchedos
module provides a~gevent.os.waitpid
function that seeks to ameliorate this. Reported in600
by champax and452
by Łukasz Kawczyński. - On platforms that implement
select.poll
, provide a gevent-friendlygevent.select.poll
and corresponding monkey-patch. Implemented in604
by Eddi Linder. - Allow passing of events to the io callback under PyPy. Reported in
531
by M. Nunberg and implemented in604
. gevent.thread.allocate_lock
(and so a monkey-patched standard library~thread.allocate_lock
) more closely matches the behaviour of the builtin: an unlocked lock cannot be released, and attempting to do so throws the correct exception (thread.error
on Python 2,RuntimeError
on Python 3). Previously, over-releasing a lock was silently ignored. Reported in308
by Jędrzej Nowak.gevent.fileobject.FileObjectThread
uses the threadpool to close the underling file-like object. Reported in201
by vitaly-krugl.- Malicious or malformed HTTP chunked transfer encoding data sent to the
pywsgi handler <gevent.pywsgi.WSGIHandler>
is handled more robustly, resulting in "HTTP 400 bad request" responses instead of a 500 error or, in the worst case, a server-side hang. Reported in229
by Björn Lindqvist. - Importing the standard library
threading
module before usinggevent.monkey.patch_all()
no longer causes Python 3.4 to fail to get therepr
of the main thread, and other CPython platforms to return an unjoinable DummyThread. (Note that this is not recommended.) Reported in153
. - Under Python 2, use the
io
package to implement~gevent.fileobject.FileObjectPosix
. This unifies the code with the Python 3 implementation, and fixes problems with usingseek()
. See151
. - Under Python 2, importing a module that uses gevent blocking functions at its top level from multiple greenlets no longer produces import errors (Python 3 handles this case natively). Reported in
108
by shaun and initial fix based on code by Sylvain Zimmer. gevent.spawn
,spawn_raw
andspawn_later
, as well as the~gevent.Greenlet
constructor, immediately produce usefulTypeErrors
if asked to run something that cannot be run. Previously, the spawned greenlet would die with an uncaughtTypeError
the first time it was switched to. Reported in119
by stephan.- Recursive use of
ThreadPool.apply <gevent.threadpool.ThreadPool.apply>
no longer raises aLoopExit
error (usingThreadPool.spawn
and thenget
on the result still could; you must be careful to use the correct hub). Reported in131
by 8mayday. - When the
threading
module ismonkey-patched <gevent.monkey.patch_thread>
, the module-level lock in thelogging
module is made greenlet-aware, as are the instance locks of any configured handlers. This makes it safer to import modules that use the standard pattern of creating a module-level~logging.Logger
instance before monkey-patching. Configuringlogging
with a basic configuration and then monkey-patching is also safer (but not configurations that involve such things as theSocketHandler
). - Fix monkey-patching of
threading.RLock
under Python 3. - Under Python 3, monkey-patching at the top-level of a module that was imported by another module could result in a
RuntimeError
fromimportlib
. Reported in615
by Daniel Mizyrycki. (The same thing could happen under Python 2 if athreading.RLock
was held around the monkey-patching call; this is less likely but not impossible with import hooks.) - Fix configuring c-ares for a 32-bit Python when running on a 64-bit platform. Reported in
381
and fixed in616
by Chris Lane. Additional fix in626
by Kevin Chen. - (Experimental) Let the
pywsgi.WSGIServer
accept alogging.Logger
instance for itslog
and (new)error_log
parameters. Take care that the system is fully monkey-patched very early in the process's lifetime if attempting this, and note that non-file handlers have not been tested. Fixes106
.
gevent.threadpool.ThreadPool.imap
andimap_unordered
now accept multiple iterables.- (Experimental) Exceptions raised from iterating using the
ThreadPool
orGroup
mapping/application functions should now have the original traceback. gevent.threadpool.ThreadPool.apply
now raises any exception raised by the called function, the same as~gevent.pool.Group
/~gevent.pool.Pool
and the builtinapply
function. This obsoletes the undocumentedapply_e
function. Original PR556
by Robert Estelle.- Monkey-patch the
selectors
module frompatch_all
andpatch_select
on Python 3.4. See591
. - Additional query functions for the
gevent.monkey
module allow knowing what was patched. Discussed in135
and implemented in325
by Nathan Hoad. - In non-monkey-patched environments under Python 2.7.9 or above or Python 3, using a gevent SSL socket could cause the greenlet to block. See
597
by David Ford. gevent.socket.socket.sendall
supports arbitrary objects that implement the buffer protocol (such as ctypes structures), just like native sockets. Reported in466
by tzickel.- Added support for the
onerror
attribute present in CFFI 1.2.0 for better signal handling under PyPy. Thanks to Armin Rigo and Omer Katz. (See https://bitbucket.org/cffi/cffi/issue/152/handling-errors-from-signal-handlers-in) - The
gevent.subprocess
module is closer in behaviour to the standard library under Python 3, at least on POSIX. Thepass_fds
,restore_signals
, andstart_new_session
arguments are now implemented, as are thetimeout
parameters to various functions. Under Python 2, the previously undocumentedtimeout
parameter toPopen.communicate <gevent.subprocess.Popen.communicate>
raises an exception like its Python 3 counterpart. - An exception starting a child process with the
gevent.subprocess
module no longer leaks file descriptors. Reported in374
by 陈小玉. - The example
echoserver.py
no longer binds to the standard X11 TCP port. Reported in485
by minusf. gevent.iwait
no longer throws~gevent.hub.LoopExit
if the caller switches greenlets between return values. Reported and initial patch in467
by Alexey Borzenkov.- The default threadpool and default threaded resolver work in a forked child process, such as with
multiprocessing.Process
. Previously the child process would hang indefinitely. Reported in230
by Lx Yu. - Fork watchers are more likely to (eventually) get called in a multi-threaded program (except on Windows). See
154
. gevent.killall
accepts an arbitrary iterable for the greenlets to kill. Reported in404
by Martin Bachwerk; seen in combination with older versions of simple-requests.gevent.local.local
objects are now eligible for garbage collection as soon as the greenlet finishes running, matching the behaviour of the built-inthreading.local
(when implemented natively). Reported in387
by AusIV.- Killing a greenlet (with
gevent.kill
orgevent.Greenlet.kill
) before it is actually started and switched to now prevents the greenlet from ever running, instead of raising an exception when it is later switched to. See330
reported by Jonathan Kamens.
- Add support for Python 3.3 and 3.4. Many people have contributed to this effort, including but not limited to Fantix King, hashstat, Elizabeth Myers, jander, Luke Woydziak, and others. See
38
. - Add support for PyPy. See
248
. Note that for best results, you'll need a very recent PyPy build including CFFI 1.2.0. - Drop support for Python 2.5. Python 2.5 users can continue to use gevent 1.0.x.
- Fix
gevent.joinall
to not ignorecount
whenraise_error
is False. See512
by Ivan Diao. - Fix
gevent.subprocess.Popen
to not ignore thebufsize
argument. Note that this changes the (platform dependent) default, typically from buffered to unbuffered. See542
by Romuald Brunet. Upgraded c-ares to 1.10.0. See
579
by Omer Katz.Caution
The c-ares
configure
script is now more strict about the contents of environment variables such asCFLAGS
andLDFLAGS
and they may have to be modified (for example,CFLAGS
is no longer allowed to include-I
directives, which must instead be placed inCPPFLAGS
).- Add a
count
argument togevent.iwait
. See482
by wiggin15. - Add a
timeout
argument togevent.queue.JoinableQueue.join
which now returns whether all items were waited for or not. gevent.queue.JoinableQueue
treatsitems
passed to__init__
as unfinished tasks, the same as if they wereput
. Initial554
by DuLLSoN.gevent.pywsgi
no longer prints debugging information for the normal conditions of a premature client disconnect. See136
, fixed in377
by Paul Collier.- (Experimental.) Waiting on or getting results from greenlets that raised exceptions now usually raises the original traceback. This should assist things like Sentry to track the original problem. See
450
and528
by Rodolfo and Eddi Linder and240
by Erik Allik. - Upgrade to libev 4.20. See
590
by Peter Renström. - Fix
gevent.baseserver.BaseServer
to be printable when itshandle
function is an instancemethod of itself. See501
by Joe Jevnik. - Make the
acquire
method ofgevent.lock.DummySemaphore
always return True, supporting its use-case as an "infinite" or unbounded semaphore providing no exclusion, and allowing the idiomif sem.acquire(): ...
. See544
by Mouad Benchchaoui. - Patch
subprocess
by default ingevent.monkey.patch_all
. See446
. gevent.pool.Group.imap
andimap_unordered
now accept multiple iterables likeitertools.imap
.565
reported by Thomas Steinacher.- Compatibility note:
gevent.baseserver.BaseServer
and its subclassgevent.server.StreamServer
now deterministically close the client socket when the request handler returns. Previously, the socket was left at the mercies of the garbage collector; under CPython 2.x this meant when the last reference went away, which was usually, but not necessarily, when the request handler returned, but under PyPy it was some arbitrary point in the future and under CPython 3.x a ResourceWarning could be generated. This was undocumented behaviour, and the client socket could be kept open after the request handler returned either accidentally or intentionally. - Compatibility note:
pywsgi
now ensures that headers can be encoded in latin-1 (ISO-8859-1). This improves adherence to the HTTP standard (and is necessary under Python 3). Under certain conditions, previous versions could have allowed non-ISO-8859-1 headers to be sent, but their interpretation by a conforming recipient is unknown; now, a UnicodeError will be raised. See614
.
- Fix LifoQueue.peek() to return correct element.
456
. Patch by Christine Spang. - Upgrade to libev 4.19
- Remove SSL3 entirely as default TLS protocol
- Import socket on Windows (closes
459
) - Fix C90 syntax error (
449
) - Add compatibility with Python 2.7.9's SSL changes.
477
.
- Fix
423
: Pool's imap/imap_unordered could hang forever. Based on patch and test by Jianfei Wang.
- pywsgi: Pass copy of error list instead of direct reference. Thanks to Jonathan Kamens, Matt Iversen.
- Ignore the autogenerated doc/gevent.*.rst files. Patch by Matthias Urlichs.
- Fix cythonpp.py on Windows. Patch by Jeryn Mathew.
- Remove gevent.run (use gevent.wait).
- Fix
251
: crash in gevent.core when accessing destroyed loop. - Fix
235
: Replace self._threadpool.close() with self._threadpool.kill() in hub.py. Patch by Jan-Philip Gehrcke. - Remove unused timeout from select.py (
254
). Patch by Saúl Ibarra Corretgé. - Rename Greenlet.link()'s argument to 'callback' (closes
244
). - Fix parallel build (
193
). Patch by Yichao Yu. - Fix
263
: potential UnboundLocalError: 'length' in gevent.pywsgi. - Simplify psycopg2_pool.py (
239
). Patch by Alex Gaynor. - pywsgi: allow Content-Length in GET requests (
264
). Patch by 陈小玉. - documentation fixes (
281
) [philipaconrad]. - Fix old documentation about default blocking behavior of kill, killall (
306
). Patch by Daniel Farina. - Fix
6
: patch sys after thread. Patch by Anton Patrushev. - subprocess: fix check_output on Py2.6 and older (
265
). Thanks to Marc Sibson for test. - Fix
302
: "python -m gevent.monkey" now sets __file__ properly. - pywsgi: fix logging when bound on unix socket (
295
). Thanks to Chris Meyers, Eugene Pankov. - pywsgi: readout request data to prevent ECONNRESET
- Fix
303
: 'requestline' AttributeError in pywsgi. Thanks to Neil Chintomby. - Fix
79
: Properly handle HTTP versions. Patch by Luca Wehrstedt. - Fix
216
: propagate errors raised by Pool.map/imap
- Fixed
210
: callbacks were not run for non-default loop (bug introduced in 1.0rc1). - patch_all() no longer patches subprocess unless subprocess=True is passed.
- Fixed AttributeError in hub.Waiter.
- Fixed
181
: make hidden imports visible to freezing tools like py2exe. Patch by Ralf Schmitt. - Fixed
202
: periodically yield when running callbacks (sleep(0) cannot block the event loop now). - Fixed
204
: os.tp_read/tp_write did not propogate errors to the caller. - Fixed
217
: do not set SO_REUSEADDR on Windows. - Fixed bug in --module argument for gevent.monkey. Patch by Örjan Persson.
- Remove warning from threadpool.py about mixing fork() and threads.
- Cleaned up hub.py from code that was needed to support older greenlets. Patch by Saúl Ibarra Corretgé.
- Allow for explicit default loop creation via get_hub(default=True). Patch by Jan-Philip Gehrcke.
- Fixed hub.switch() not to touch stacktrace when switching. greenlet restores the exception information correctly since version 0.3.2. gevent now requires greenlet >= 0.3.2
- Added gevent.wait() and gevent.iwait(). This is like gevent.joinall() but supports more objects, including Greenlet, Event, Semaphore, Popen. Without arguments it waits for the event loop to finish (previously gevent.run() did that). gevent.run will be removed before final release and gevent.joinall() might be deprecated.
- Reimplemented loop.run_callback with a list and a single prepare watcher; this fixes the order of spawns and improves performance a little.
- Fixes Semaphore/Lock not to init hub in __init__, so that it's possible to have module-global locks without initializing the hub. This fixes monkey.patch_all() not to init the hub.
- New implementation of callbacks that executes them in the order they were added. core.loop.callback is removed.
- Fixed 2.5 compatibility.
- Fixed crash on Windows when request 'prev' and 'attr' attributes of 'stat' watcher. The attribute access still fails, but now with an exception.
- Added known_failures.txt that lists all the tests that fail. It can be used by testrunner.py via expected option. It's used when running the test suite in travis.
- Fixed socket, ssl and fileobject to not mask EBADF error - it is now propogated to the caller. Previously EBADF was converted to empty read/write. Thanks to Vitaly Kruglikov
- Removed gevent.event.waitall()
- Renamed FileObjectThreadPool -> FileObjectThread
- Greenlet: Fixed
143
: greenlet links are now executed in the order they were added - Synchronize access to FileObjectThread with Semaphore
- EINVAL is no longer handled in fileobject.
monkey:
- Fixed
178
: disable monkey patch os.read/os.write - Fixed monkey.patch_thread() to patch threading._DummyThread to avoid leak in threading._active. Original patch by Wil Tan.
- added Event=False argument to patch_all() and patch_thread
- added patch_sys() which patches stdin, stdout, stderr with FileObjectThread wrappers. Experimental / buggy.
- monkey patching everything no longer initializes the hub/event loop.
socket:
- create_connection: do not lookup IPv6 address if IPv6 is unsupported. Patch by Ralf Schmitt.
pywsgi:
- Fixed
86
: bytearray is now supported. Original patch by Aaron Westendorf. - Fixed
116
: Multiline HTTP headers are now handled properly. Patch by Ralf Schmitt.
subprocess:
- Fixed Windows compatibility. The wait() method now also supports 'timeout' argument on Windows.
- Popen: Added rawlink() method, which makes Popen objects supported by gevent.wait(). Updated examples/processes.py
- Fixed
148
: read from errpipe_read in small chunks, to avoid trigger EINVAL issue on Mac OS X. Patch by Vitaly Kruglikov - Do os._exit() in "finally" section to avoid executing unrelated code. Patch by Vitaly Kruglikov.
resolver_ares:
- improve getaddrinfo: For string ports (e.g. "http") resolver_ares/getaddrinfo previously only checked either getservbyname(port, "tcp") or getservbyname(port, "udp"), but never both. It now checks both of them.
- gevent.ares.channel now accepts strings as arguments
- upgraded c-ares to cares-1_9_1-12-g805c736
- it is now possible to configure resolver_ares directly with environ, like GEVENTARES_SERVERS
os:
- Renamed threadpool_read/write to tp_read/write.
- Removed posix_read, posix_write.
- Added nb_read, nb_write, make_nonblocking.
hub:
- The system error is now raised immediatelly in main greenlet in all cases.
- Dropped support for old greenlet versions (need >= 0.3.2 now)
core:
- allow 'callback' property of watcher to be set to None. "del w.callback" no longer works.
- added missing 'noinotify' flag
Misc:
- gevent.thread: allocate_lock is now an alias for LockType/Semaphore. That way it does not fail when being used as class member.
- Updated greentest.py to start timeouts with ref=False.
- pool: remove unused get_values() function
- setup.py now recognizes GEVENTSETUP_EV_VERIFY env var which sets EV_VERIFY macro when compiling
- Added a few micro benchmarks
- stdlib tests that we care about are now included in greentest/2.x directories, so we don't depend on them being installed system-wide
- updated util/makedist.py
- the testrunner was completely rewritten.
- Added gevent.os module with 'read' and 'write' functions. Patch by Geert Jansen.
- Moved gevent.hub.fork to gevent.os module (it is still available as gevent.fork).
- Fixed
148
: Made fileobject handle EINVAL, which is randomly raised by os.read/os.write on Mac OS X. Thanks to Mark Hingston. - Fixed
150
: gevent.fileobject.SocketAdapter.sendall() could needlessly wait for write event on the descriptor. Original patch by Mark Hingston. - Fixed AttributeError in baseserver. In case of error, start() would call kill() which was renamed to close(). Thanks to Vitaly Kruglikov.
- New gevent.subprocess module
- New gevent.fileobject module
- Fixed ThreadPool to discard references of the objects passed to it (function, arguments) asap. Previously they could be stored for unlimited time until the thread gets a new job.
- Fixed
138
: gevent.pool.Pool().imap_unordered hangs with an empty iterator. Thanks to exproxus. - Fixed
127
: ssl.py could raise TypeError in certain cases. Thanks to Johan Mjones. - Fixed socket.makefile() to keep the timeout setting of the socket instance. Thanks to Colin Marc.
- Added 'copy()' method to queues.
- The 'nochild' event loop config option is removed. The install_sigchld offer more flexible way of enabling child watchers.
- core: all watchers except for 'child' now accept new 'priority' keyword argument
- gevent.Timeout accepts new arguments: 'ref' and 'priority'. The default priority for Timeout is -1.
- Hub.wait() uses Waiter now instead of raw switching
- Updated libev to the latest CVS version
- Made pywsgi to raise an AssertionError if non-zero content-length is passed to start_response(204/304) or if non-empty body is attempted to be written for 304/204 response
- Removed pywsgi feature to capitalize the passed headers.
- Fixed util/cythonpp.py to work on python3.2 (
123
). Patch by Alexandre Kandalintsev. - Added 'closed' readonly property to socket.
- Added 'ref' read/write property to socket.
- setup.py now parses CARES_EMBED and LIBEV_EMBED parameters, in addition to EMBED.
- gevent.reinit() and gevent.fork() only reinit hub if it was created and do not create it themselves
- Fixed setup.py not to add libev and c-ares to include dirs in non-embed mode. Patch by Ralf Schmitt.
- Renamed util/make_dist.py to util/makedist.py
- testrunner.py now saves more information about the system; the stat printing functionality is moved to a separate util/stat.py script.
Major and backward-incompatible changes:
- Made the threadpool-based resolver the default. To enable the ares-based resolver, set GEVENT_RESOLVER=ares env var.
- Added support for child watchers (not available on Windows).
- Libev loop now reaps all children by default.
- If NOCHILD flag is passed to the loop, child watchers and child reaping are disabled.
- Renamed gevent.coros to gevent.lock. The gevent.coros is still available but deprecated.
- Added 'stat' watchers to loop.
- The setup.py now recognizes gevent_embed env var. When set to "no", bundled c-ares and libev are ignored.
- Added optional 'ref' argument to sleep(). When ref=false, the watchers created by sleep() do not hold gevent.run() from exiting.
- ThreadPool now calls Hub.handle_error for exceptions in worker threads.
- ThreadPool got new method: apply_e.
- Added new extension module gevent._util and moved gevent.core.set_exc_info function there.
- Added new extension module gevent._semaphore. It contains Semaphore class which is imported by gevent.lock as gevent.lock.Semaphore. Providing Semaphore in extension module ensures that trace function set with settrace will not be called during __exit__. Thanks to Ralf Schmitt.
- It is now possible to kill or pre-spawn threads in ThreadPool by setting its 'size' property.
core:
- Make sure the default loop cannot be destroyed more than once, thus crashing the process.
- Make Hub.destroy() method not to destroy the default loop, unless destroy_loop is True. Non-default loops are still destroyed by default.
- loop: Removed properties from loop: fdchangecnt, timercnt, asynccnt.
- loop: Added properties: sigfd, origflags, origflags_int
- loop: The EVFLAG_NOENV is now always passed to libev. Thus LIBEV_FLAGS env variable is no longer checked. Use GEVENT_BACKEND.
Misc:
- Check that the argument of link() is callable. Raise TypeError when it's not.
- Fixed TypeError in baseserver when parsing an address.
- Pool: made add() and discard() usable by external users. Thanks to Danil Eremeev.
- When specifying a class to import, it is now possible to use format path/package.module.name
- pywsgi: Made sure format_request() does not fail if 'status' attribute is not set yet
- pywsgi: Added REMOTE_PORT variable to the environment.
Examples:
- portforwarder.py now shows how to use gevent.run() to implement graceful shutdown of a server.
- psycopg2_pool.py: Changed execute() to return rowcount.
- psycopg2_pool.py: Added fetchall() and fetchiter() methods.
Developer utilities:
- When building, CYTHON env variable can be used to specify Cython executable to use.
- util/make_dist.py now recongizes --fast and --revert options. Previous --rsync option is removed.
- Added util/winvbox.py which automates building/testing/making binaries on Windows VM.
- Fixed typos in exception handling code in testrunner.py
- Fixed patching unittest.runner on Python2.7. This caused the details of test cases run lost.
- Made testrunner.py kill the whole process group after test is done.
Backward-incompatible changes:
- Removed "link to greenlet" feature of Greenlet.
- If greenlet module older than 0.3.2 is used, then greenlet.GreenletExit.__bases__ is monkey patched to derive from BaseException and not Exception. That way gevent.GreenletExit is always derived from BaseException, regardless of installed greenlet version.
- Some code supporting Python 2.4 has been removed.
Release highlights:
- Added thread pool: gevent.threadpool.ThreadPool.
- Added thread pool-based resolver. Enable with GEVENT_RESOLVER=thread.
- Added UDP server: gevent.server.DatagramServer
- A "configure" is now run on libev. This fixes a problem of 'kqueue' not being available on Mac OS X.
- Gevent recognizes some environment variables now:
- GEVENT_BACKEND allows passing argument to loop, e.g. "GEVENT_BACKEND=select" for force select backend
- GEVENT_RESOLVER allows choosing resolver class.
- GEVENT_THREADPOOL allows choosing thread pool class.
- Added new examples: portforwarder, psycopg2_pool.py, threadpool.py, udp_server.py
- Fixed non-embedding build. To build against system libev, remove or rename 'libev' directory. To build against system c-ares, remove or rename 'c-ares'. Thanks to Örjan Persson.
misc: - gevent.joinall() method now accepts optional 'count' keyword. - gevent.fork() only calls reinit() in the child process now. - gevent.run() now returns False when exiting because of timeout or event (previous None). - Hub got a new method: destroy(). - Hub got a new property: threadpool.
ares.pyx: - Fixed 104
: made ares_host_result pickable. Thanks to Shaun Cutts.
pywsgi: - Removed unused deprecated 'wfile' property from WSGIHandler - Fixed 92
: raise IOError on truncated POST requests. - Fixed 93
: do not sent multiple "100 continue" responses
core: - Fixed 97
: the timer watcher now calls ev_now_update() in start() and again() unless 'update' keyword is passed and set to False. - add set_syserr_cb() function; it's used by gevent internally. - gevent now installs syserr callback using libev's set_syserr_cb. This callback is called when libev encounters an error it cannot recover from. The default action is to print a message and abort. With the callback installed, a SystemError() is now raised in the main greenlet. - renamed 'backend_fd' property to 'fileno()' method. (not available if you build gevent against system libev) - added 'asynccnt' property (not available if you build gevent against system libev) - made loop.__repr__ output a bit more compact - the watchers check the arguments for validness now (previously invalid argument would crash libev). - The 'async' watcher now has send() method; - fixed time() function - libev has been upgraded to latest CVS version. - libev has been patched to use send()/recv() for evpipe on windows when libev_vfd.h is in effect
resolver_ares: - Slightly improved compatibility with stdlib's socket in some error cases.
socket: - Fixed close() method not to reference any globals - Fixed 115
: _dummy gets unexpected Timeout arg - Removed _fileobject used for python 2.4 compatibility in socket.py - Fixed 94
: fallback to buffer if memoryview fails in _get_memory on python 2.7
monkey: - Removed patch_httplib() - Fixed 112
: threading._sleep is not patched. Thanks to David LaBissoniere. - Added get_unpatched() function. However, it is slightly broken at the moment.
backdoor: - make 'locals()' not spew out __builtin__.__dict__ in backdoor - add optional banner argument to BackdoorServer
servers: - add server.DatagramServer; - StreamServer: 'ssl_enabled' is now a read-only property - servers no longer have 'kill' method; it has been renamed to 'close'. - listeners can now be configured as strings, e.g. ':80' or 80 - modify baseserver.BaseServer in such a way that makes it a good base class for both StreamServer and DatagramServer - BaseServer no longer accepts 'backlog' parameter. It is now done by StreamServer. - BaseServer implements start_accepting() and stop_accepting() methods - BaseServer now implements "temporarily stop accepting" strategy - BaseServer now has _do_read method which does everything except for actually calling accept()/recvfrom() - pre_start() method is renamed to init_socket() - renamed _stopped_event to _stop_event - 'started' is now a read-only property (which actually reports state of _stop_event) - post_stop() method is removed - close() now sets _stop_event(), thus setting 'started' to False, thus causing serve_forever() to exit - _tcp_listener() function is moved from baseserver.py to server.py - added 'fatal_errors' class attribute which is a tuple of all errnos that should kill the server
coros: - Semaphore: add _start_notify() method - Semaphore: avoid copying list of links; rawlink() no longer schedules notification
Added 'ref' property to all watchers. Settings it to False make watcher call ev_unref/ev_ref appropriately so that this watcher does not prevent loop.run()/hub.join()/run() from exiting. Made resolver_ares.Resolver use 'ref' property for internal watcher.
In all servers, method "kill" was renamed to "close". The old name is available as deprecated alias.
Added a few properties to the loop: backend_fd, fdchangecnt, timercnt.
Upgraded c-ares to 1.7.5+patch.
Fixed getaddrinfo to return results in the order (::1, IPv4, IPv6).
Fixed getaddrinfo() to handle integer of string type. Thanks to kconor.
Fixed gethostbyname() to handle '' (empty string).
Fixed getaddrinfo() to convert UnicodeEncodeError into error('Int or String expected').
Fixed getaddrinfo() to uses the lowest 16 bits of passed port integer similar to built-in _socket.
Fixed getnameinfo() to call getaddrinfo() to process arguments similar to built-in _socket.
Fixed gethostbyaddr() to use getaddrinfo() to process arguments.
version_info is now a 5-tuple.
Added handle_system_error() method to Hub (used internally).
Fixed Hub's run() method to never exit. This prevent inappropriate switches into parent greenlet.
Fixed Hub.join() to return True if Hub was already dead.
Added 'event' argument to Hub.join().
Added run() function to gevent top level package.
Fixed Greenlet.start() to exit silently if greenlet was already started rather than raising AssertionError
.
Fixed Greenlet.start() not to schedule another switch if greenlet is already dead.
Fixed gevent.signal() to spawn Greenlet instead of raw greenlet. Also it'll switch into the new greenlet immediately instead of scheduling additional callback.
Do monkey patch create_connection() as gevent's version works better with gevent.socket.socket than the standard create_connection.
pywsgi: make sure we don't try to read more requests if socket operation failed with EPIPE
pywsgi: if we failed to send the reply, change 'status' to socket error so that the logs mention the error.
Fixed a bug in gevent.queue.Channel class. (Thanks to Alexey Borzenkov)
Backward-incompatible changes:
- Dropped support for Python 2.4.
- Queue(0) is now equivalent to an unbound queue and raises
DeprecationError
. Usegevent.queue.Channel
if you need a channel. - Deprecated ability to pass a greenlet instance to
Greenlet.link
,Greenlet.link_value
andGreenlet.link_exception
. - All of
gevent.core
has been rewritten and the interface is not compatible. SystemExit
andSystemError
now kill the whole process instead of printing a traceback.- Removed deprecated
util.lazy_property
property. - Removed
gevent.dns
module. - Removed deprecated gevent.sslold module
- Removed deprecated gevent.rawgreenlet module
- Removed deprecated name GreenletSet which used to be alias for
Group
.
Release highlights:
- The
gevent.core
module now wraps libev's API and is not compatible with gevent 0.x. - Added a concept of pluggable event loops. By default gevent.core.loop is used, which is a wrapper around libev.
- Added a concept of pluggable name resolvers. By default a resolver based on c-ares library is used.
- Added support for multiple OS threads, each new thread will get its own Hub instance with its own event loop.
- The release now includes and embeds the dependencies: libev and c-ares.
- The standard
signal
works now as expected. - The unhandled errors are now handled uniformely by Hub.handle_error function.
- Added
Channel
class togevent.queue
module. It is equivalent to Queue(0) in gevent 0.x, which is deprecated now. - Added method
peek
toQueue
class. - Added
idle
function which blocks until the event loop is idle. - Added a way to gracefully shutdown the application by waiting for all outstanding greenlets/servers/watchers:
Hub.join
. - Added new
gevent.ares
C extension which wraps c-ares and provides asynchronous DNS resolver. - Added new
gevent.resolver_ares
module provides synchronous API on top ofgevent.ares
.
The gevent.socket
module:
- DNS functions now use c-ares library rather than libevent-dns. This fixes a number of problems with name resolving:
- Fix
2
: DNS resolver no longer breaks after fork(). You still need to callgevent.fork
(os.fork is monkey patched with it if monkey.patch_all() was called).
- Fix
- DNS resolver no longer ignores /etc/resolv.conf and /etc/hosts.
- The following functions were added to socket module
- gethostbyname_ex
- getnameinfo
- gethostbyaddr
- getfqdn
- Removed undocumented bind_and_listen and tcp_listener
The Hub
object:
- Added
join
method which waits until the event loop exits or optional timeout expires. - Added
wait
method which waits until a watcher has got an event. - Added
handle_error
method which is called by all of gevent in case of unhandled exception. - Added
print_exception
method which is called by handle_error to print the exception traceback.
The Greenlet
objects:
- Added __nonzero__ implementation that returns True after greenlet was started until it's dead. Previously greenlet was False after start() until it was first switched to.
The mod:gevent.pool module:
- It is now possible to add raw greenlets to the pool.
- The
map
andimap
methods now start yielding the results as soon as possible. - The
imap_unordered
no longer swallows an exception raised while iterating its argument.
Miscellaneous:
- gevent.sleep(<negative value>) no longer raises an exception, instead it does sleep(0).
- Added method clear to internal Waiter class.
- Removed wait method from internal Waiter class.
- The
WSGIServer
now sets max_accept to 1 if wsgi.multiprocessing is set to True. - Added
monkey.patch_module
function that monkey patches module using __implements__ list provided by gevent module. All of gevent modules that replace stdlib module now have __implements__ attribute.
- Fixed
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
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
94
: fallback to buffer if memoryview fails in _get_memory on python 2.7. - Fixed
103
:Queue(None).full()
returnsFalse
now (previously it returnedTrue
). - Fixed
112
: threading._sleep is not patched. Thanks to David LaBissoniere. - Fixed
115
: _dummy gets unexpected Timeout arg.
- Added
__copy__
method togevent.local.local
class that implements copy semantics compatible with built-inthreading.local
. Patch by Galfy Pundee. - Fixed
StreamServer
class to catchEWOULDBLOCK
rather thanEAGAIN
. This fixes lots of spurious tracebacks on Windows where these two constants are not the same. Patch by Alexey Borzenkov. - Fixed
65
:fork
now callsevent_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 whenenviron["wsgi.input"].read
function was called with an integer argument. - Fixed
63
:monkey.patch_thread
now patchesthreading
too, even if it's already imported. Patch by Shaun Lindsay. - Fixed
64
:joinall
andkillall
functions used to hang if their argument contained duplicate greenlets. - Fixed
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
67
: Madewsgi.WSGIServer
addREQUEST_URI
to environ. Patch by Andreas Blixt. - Fixed
71
: monkey patchinghttplib
withgevent.httplib
used to breakHTTPSConnection
. Patch by Nick Barkas. - Fixed
74
:create_connection <gevent.socket.create_connection>
now raises proper exception whengetaddrinfo
fails. - Fixed
BaseServer.__repr__
method,BaseServer.server_host
andBaseServer.server_port
attributes to handle the case ofAF_UNIX
addresses properly. Previously they assumed address is always a tuple. - Fixed
pywsgi.WSGIServer
to handleAF_UNIX
listeners. 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_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 <gevent.socket.getaddrinfo>
by callingresolve_ipv4
andresolve_ipv6
concurrently rather than sequentially inAF_UNSPEC
case.
- Added
gevent.httplib
-- experimental support for libevent-http client (9
). Thanks to Tommie Gannert, Örjan Persson. - Fixed crash on Mac OS X (
31
). Patch by Alexey Borzenkov. - Fixed compatiblity of
gevent.wsgi
with libevent2 (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 handleAF_UNSPEC
properly and resolve service names (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 shutdownSSLSocket
properly, without raisingSSLError(read operation timeout)
. - Fixed
TypeError
insideHub
on Python 2.4. - Made a number of internal improvements to
gevent.pywsgi
to make subclassing easier. - Changed
WSGIServer <pywsgi.WSGIServer>
to explicitly close the socket after the last request. Patch by Ralf Schmitt. - Fixed
pywsgi.WSGIHandler
not to addCONTENT_TYPE
to the environ dict when there's noContent-Type
header in the request. Previously a defaulttext/plain
was added in such case. - Added proper implementation of
imap_unordered <gevent.pool.Group.imap_unordered>
toPool
class. Unlike previous "dummy" implementation this one starts yielding the results as soon as they are ready. - Implemented iterator protocol in
Queue <gevent.queue.Queue>
. The main use case is the implementation ofPool.imap_unordered
. - Fixed
BaseServer.started
property: it is now set toTrue
afterstart <StreamServer.start>
untilstop <StreamServer.stop>
orkill <StreamServer.kill>
. Previously it could becomeFalse
for short period of times, becauseStreamServer
could stop accepting for a while in presence of errors andStreamServer.started
was defined as "whether the server is currently accepting". - Fixed
wsgi.WSGIServer
to reply with 500 error immediatelly if the application raises an error (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
write <core.buffer.write>
method tocore.buffer
. - Fixed
OverflowError
that could happen incore.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 tosetup.py
. Patch by Ralf Schmitt. - Updated
local <gevent.local.local>
to raiseAttributeError
if__dict__
attribute is set or deleted.
Release highlights:
- Fixed
monkey
to patchsocket.create_connection <gevent.socket.create_connection>
. - Updated
gevent.ssl
module to fully match the functionality ofssl
on Python 2.7. - Fixed
Group.join
to handleraise_error=True
properly, it used to raiseTypeError
(36
). Thanks to by David Hain. - Fixed
gevent.wsgi
andgevent.pywsgi
to join multipleCookie
headers (40
). - Fixed
select <gevent.select.select>
to recognizelong
arguments in addition toint
. - Fixed
Semaphore.acquire
to returnFalse
when timeout expires instead of raisingAssertionError
(39
). Patch by Erik Näslund. - Fixed
JoinableQueue.join
to return immediatelly if queue is already empty (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
insocket.connect_ex
method. Patch by Alexey Borzenkov. - Fixed socket leak in
create_connection
function. - Made
gevent.socket
import all public items from stdlibsocket
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 truely 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.
- Calling
- Added support for ciphers argument.
- Updated
SSLSocket.send
andSSLSocket.recv
methods to match the behavior of stdlibssl
better. - Fixed
ssl.SSLObject
to delete events used by other greenlets when closing the instance (34
).
Miscellaneous:
- Made
BaseServer
acceptlong
values as pool argument in addition toint
. - 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 onSystemExit
and simplified the code. - Made
Pool
raiseValueError
when initialized withsize=0
. - Updated
setup.py --libevent
to configure and make libevent if it's not built already. - Updated
setup.py
to usesetuptools
if present and add dependency ongreenlet
. - Fixed doc/mysphinxext.py to work with Sphinx 1. Thanks by Örjan Persson.
Release highlights:
- Added
gevent.server
module withStreamServer
class for easy implementing of TCP and SSL servers. - Added
gevent.baseserver
module withBaseServer
class. - Added new implementation of
gevent.pywsgi
based ongevent.server
. Contributed by Ralf Schmitt. - Added
gevent.local
module. Fixed24
. Thanks to Ted Suzman. - Fixed a number of bugs in
gevent.wsgi
module. - Fixed
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
andgevent.pywsgi
much more similar to each other. - Fixed compilation on Windows with libevent-2.
- Improved Windows compatibility. Fixed
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
'sspawn
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
andsocket.wait_read
and similar. UseNone
from now on, which is compatible with the previous versions. - Derived
backdoor.BackdoorServer
fromStreamServer
rather than fromGreenlet
. This adds lots of new features and removes a few old ones. - Removed non-standard
balance
property 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
rawgreenlet
module. - Deprecated
util.lazy_property
. - Renamed
GreenletSet
toGroup
. The old name is currently available as an alias.
gevent.socket
module:
- Fixed issues
26
and34
: closing the socket while reading/writing/connecting is now safe. Thanks to Cyril Bay. - Imported
getfqdn
fromsocket
module. - The module now uses
sys.platform
to detect Windows rather thanplatform
module. - Fixed
27
:getaddrinfo
used to handle the case when socktype or proto were equal to0
. Thanks to Randall Leeds.
gevent.coros
module:
- Added
RLock
class. - Added
DummySemaphore
class. - Fixed
BoundedSemaphore
class to behave likethreading.BoundedSemaphore
behaves.
gevent.event
module:
- Made
Event.wait
return internal flag instead ofNone
. - Made
AsyncResult.wait
return itsvalue
instead ofNone
. - Added
ready
method as an alias foris_set
.
gevent.wsgi
module:
- Removed
wsgi.buffer_proxy
.
gevent.pywsgi
module:
- Rewritten to use
server
and not to depend onBaseHTTPServer
. - Changed the interface to match
wsgi
module. Removedserver
function, addServer
class, addedWSGIServer
class. - Renamed
HttpProtocol
toWSGIHandler
. - 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
andreadwrite_event
. - Made all of the event loop callbacks clear the exception info before exiting.
- Added
flags_str
property toevent
. It is used by__str__
and__repr__
. buffer <core.buffer>
:- Added
detach
method. - Implemented iterator protocol.
- Fixed
readline
andreadlines
methods.
- Added
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
andoutput_buffer
store and reuse thebuffer
object they create. - Fixed
__str__
and meth:__repr__ to include spaces where needed. http
class no longer hasset_cb
andset_gencb
. Instead its contructor accepts handle which will be called on each request.
- Fixed
gevent.http
and gevent.wsgi
modules:
- Made
HTTPServer
use"Connection: close"
header by default. - Class
HTTPServer
now 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
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 useGreenlet
instead of raw greenlets. This means monkey patched thread will becomeGreenlet
too. - Added
started
property toGreenlet
. - Put common server code in
gevent.baseserver
module. All servers in gevent package are now derived fromBaseServer
. - Fixed
20
:sleep
now raisesIOError
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 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
backdoor
when a client typedquit()
. - 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 spawnGreenlet
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
togevent/core.so
. gevent.socket
: Improved compatibility with stdlib's socket:- Fixed
socket <gevent.socket.socket>
to raisetimeout("timed out")
rather than simplytimeout
. - Imported
_GLOBAL_DEFAULT_TIMEOUT
from standardsocket
module instead of creating a new object.
- Fixed
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
andsocket.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
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 ignoreWSAEINVAL
on 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
_sock
property. - Imported the constants and some utility functions from stdlib's
socket
intogevent.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
sslerror
tosocket.__all__
. - Removed
GreenSocket
alias for socket class. - Moved PyOpenSSL-based implementation of
socket.ssl
intogevent.oldssl
module. It's imported intogevent.socket
if importinggevent.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 <gevent.select.select>
to clean up properly if event creation fails. - Fixed
select <gevent.select.select>
to raiseselect.error
instead 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
#warning
directives fromlibevent.h
. They are not supported by vc90. - Removed some deprecated stuff from
coros
. - Internal class
Waiter <gevent.hub.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 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
test
package directly and run them in monkey patched environment. - Added examples/process.py by Marcus Cavanaugh.
- Fixed
wsgi
to unquoteenviron['PATH_INFO']
before passing to application. - Added
SERVER_SOFTWARE
variable towsgi
environ. - Fixed bug in
JoinableQueue.task_done
that causedValueError
to be raised incorrectly here. - Fixed
gevent.socket
not to fail withImportError
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
'sstart_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 raiseTimeout
; now it returns silently. - Fixed
signal
to run the signal handler in a new greenlet; it was run in theHub
greenlet before. - Fixed
Timeout.start_new
: if passed aTimeout
instance, it now calls itsstart <Timeout.start>
method before returning it. - Fixed
gevent.monkey
to patchthreading.local
properly. - Fixed
Queue.empty
andQueue.full
to be compatible with the standardQueue
. It tried to take into account the greenlets currently blocking onget <Queue.get>
/put <Queue.put>
which was not useful and hard to reason about. Now it simply comparesqsize <Queue.qsize>
to maxsize, which what the standardQueue
does too. - Fixed
Event
to behave exactly like the standardthreading.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 fromEvent
anymore and does missclear()
method.
- Renamed internal helpers
socket.wait_reader
/socket.wait_writer
tosocket.wait_read
/socket.wait_write
. - Renamed
gevent.socket.GreenSocket
togevent.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
togevent.pywsgi
. - Added a new HTTP server
gevent.http
module based on libevent-http wrappers. - Added a new WSGI server
gevent.wsgi
module based ongevent.http
. - Added evdns wrappers to
gevent.core
and DNS functions togevent.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 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.
- 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 aTimeout
. - Added
gevent.Greenlet
class which is a subclass of greenlet that adds a few useful methodsjoin <Greenlet.join>
/get <Greenlet.get>
/kill <Greenlet.kill>
/link <Greenlet.link>
. spawn
now returnsGreenlet
instance. The oldspawn
, which returnspy.magic.greenlet
instance, can be still accessed asspawn_raw
.Note
The implementation of
Greenlet
is an improvement onproc
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 withGreenlet.rawlink
method. - Proc cannot be easily subclassed. To subclass
Greenlet
, override its _run and __init__ methods.
- Proc was not a subclass of greenlet which makes
- Added
pool.Pool
class with the methods compatible to the standardmultiprocessing.pool
:apply <Pool.apply>
,map <Pool.map>
and others. It also hasspawn <Pool.spawn>
method which is always async and returns aGreenlet
instance. - Added
gevent.event
module with 2 classes:Event
andAsyncResult
.Event
is a drop-in replacement forthreading.Event
, supportingset <Event.set>
/wait <Event.wait>
/get
methods.AsyncResult
is an extension ofEvent
that supports exception passing viaset_exception <AsyncResult.set_exception>
method. - Added
queue.JoinableQueue
class withtask_done <queue.JoinableQueue.task_done>
andjoin <queue.JoinableQueue.join>
methods. - Renamed
core.read
andcore.write
classes tocore.read_event
andcore.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
spawn_raw
joinall
killall
Greenlet
GreenletExit
core
The following items were marked as deprecated:
- gevent.proc module (
wrap_errors
helper was moved toutil
module) - gevent.coros.event
- gevent.coros.Queue and gevent.coros.Channel
Internally, gevent.greenlet
was split into a number of modules:
gevent.hub
providesHub
class and basic utilities, likesleep
;Hub
is now a subclass of greenlet.gevent.timeout
providesTimeout
andwith_timeout
;gevent.greenlet
providesGreenlet
class and helpers likejoinall
andkillall
.gevent.rawgreenlet
contains the old "polling" versions ofjoinall <rawgreenlet.joinall>
andkillall <rawgreenlet.killall>
(they do not needlink <Greenlet.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
andPriorityQueue
are implemented as well.gevent.queue
will deprecate bothcoros.Queue
andcoros.Channel
. - Fixed
Timeout
to raise itself by default.TimeoutError
is gone. Silent timeout is now created by passingFalse
instead 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.join
andgreenlet.joinall
functions and it become more responsive, with gradual increase of sleep time.- Renamed
proc.RunningProcSet
toproc.ProcSet
. - Added
shutdown
function, which blocks until libevent has finished dispatching the events. - The return value of
event_add
andevent_del
in core.pyx are now checked properly andIOError
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 intest_socket_ssl.py
. - Removed
GreenSocket.makeGreenFile
; Usesocket.socket.makefile
that returns_fileobject
and is available on bothGreenSocket <gevent.socket.socket>
andGreenSSL <gevent.socket.GreenSSL>
. Thegevent.socket
is still a work in progress. - Added new
core.active_event
class that takes advantage of libevent'sevent_active
function.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_event
is 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 <event.fd>
,events <event.events>
,events_str <event.events_str>
andflags <event.flags>
. It also has__enter__ <event.__enter__>
and__exit__ <event.__exit__>
now, so it can be used as a context manager.event
'scallback <event.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'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 fixesepoll
and 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.py
not to depend onsetuptools
. - Removed
gevent.timeout
. Usegevent.Timeout
.
- Fixed compilation with libevent-1.3. Thanks to Litao Wei for reporting the problem.
- Fixed
Hub
to recover silently afterevent_dispatch()
failures (I've seen this happen afterfork
even 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__.py
was moved togevent/greenlet.py
.gevent/__init__.py
imports some of it back but not everything. - Renamed
gevent.timeout
togevent.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.Queue
a replacement for a standardQueue
(not good at all, timeouts inqueue.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 <socket.socket>
now wraps asocket
object from_socket
module rather than fromsocket
.
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.close <socket.socket.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.