File: changelog_1_0.rst

package info (click to toggle)
python-gevent 24.11.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 20,364 kB
  • sloc: python: 138,768; ansic: 87,807; sh: 12,548; makefile: 2,379; javascript: 108
file content (603 lines) | stat: -rw-r--r-- 25,064 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
=================
 Changes for 1.0
=================

.. currentmodule:: gevent


Release 1.0.2
=============

- Fix LifoQueue.peek() to return correct element. :pr:`456`. Patch by
  Christine Spang.
- Upgrade to libev 4.19
- Remove SSL3 entirely as default TLS protocol
- Import socket on Windows (closes :issue:`459`)
- Fix C90 syntax error (:pr:`449`)
- Add compatibility with Python 2.7.9's SSL changes. :issue:`477`.

Release 1.0.1
=============

- Fix :issue:`423`: Pool's imap/imap_unordered could hang forever.
  Based on patch and test by Jianfei Wang.


Release 1.0 (Nov 26, 2013)
==========================

- 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).


Release 1.0rc3 (Sep 14, 2013)
=============================

- Fix :issue:`251`: crash in gevent.core when accessing destroyed
  loop.
- Fix :issue:`235`: Replace self._threadpool.close() with
  self._threadpool.kill() in hub.py. Patch by Jan-Philip Gehrcke.
- Remove unused timeout from select.py (:issue:`254`). Patch by Saúl
  Ibarra Corretgé.
- Rename Greenlet.link()'s argument to 'callback' (closes
  :issue:`244`).
- Fix parallel build (:issue:`193`). Patch by Yichao Yu.
- Fix :issue:`263`: potential UnboundLocalError: 'length' in gevent.pywsgi.
- Simplify psycopg2_pool.py (:issue:`239`). Patch by Alex Gaynor.
- pywsgi: allow Content-Length in GET requests (:issue:`264`). Patch by 陈小玉.
- documentation fixes (:issue:`281`) [philipaconrad].
- Fix old documentation about default blocking behavior of kill,
  killall (:issue:`306`). Patch by Daniel Farina.
- Fix :issue:`6`: patch sys after thread. Patch by Anton Patrushev.
- subprocess: fix check_output on Py2.6 and older (:issue:`265`).
  Thanks to Marc Sibson for test.
- Fix :issue:`302`: "python -m gevent.monkey" now sets ``__file__``
  properly.
- pywsgi: fix logging when bound on unix socket (:issue:`295`). Thanks
  to Chris Meyers, Eugene Pankov.
- pywsgi: readout request data to prevent ECONNRESET
- Fix :issue:`303`: 'requestline' AttributeError in pywsgi. Thanks to Neil Chintomby.
- Fix :issue:`79`: Properly handle HTTP versions. Patch by Luca Wehrstedt.
- Fix :issue:`216`: propagate errors raised by Pool.map/imap


Release 1.0rc2 (Dec 10, 2012)
=============================

- Fixed :issue:`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 :issue:`181`: make hidden imports visible to freezing tools like py2exe. Patch by Ralf Schmitt.
- Fixed :issue:`202`: periodically yield when running callbacks (sleep(0) cannot block the event loop now).
- Fixed :issue:`204`: os.tp_read/tp_write did not propogate errors to the caller.
- Fixed :issue:`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.


Release 1.0rc1 (Oct 30, 2012)
=============================

- 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 :issue:`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 :issue:`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 :issue:`86`: bytearray is now supported. Original patch by Aaron Westendorf.
- Fixed :issue:`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 :issue:`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 immediately 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.


Release 1.0b4 (Sep 6, 2012)
===========================

- 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 :issue:`148`: Made fileobject handle EINVAL, which is randomly
  raised by os.read/os.write on Mac OS X. Thanks to Mark Hingston.
- Fixed :issue:`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.


Release 1.0b3 (Jul 27, 2012)
============================

- 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 :issue:`138`: gevent.pool.Pool().imap_unordered hangs with an empty iterator. Thanks to exproxus.
- Fixed :issue:`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 (:issue:`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.


Release 1.0b2 (Apr 11, 2012)
============================

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.


Release 1.0b1 (Jan 10, 2012)
============================

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 :issue:`104`: made ares_host_result pickable. Thanks to Shaun Cutts.

pywsgi:

- Removed unused deprecated 'wfile' property from WSGIHandler
- Fixed :issue:`92`: raise IOError on truncated POST requests.
- Fixed :issue:`93`: do not sent multiple "100 continue" responses

core:

- Fixed :issue:`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 :issue:`115`: _dummy gets unexpected Timeout arg
- Removed _fileobject used for python 2.4 compatibility in socket.py
- Fixed :issue:`94`: fallback to buffer if memoryview fails in _get_memory on python 2.7

monkey:

- Removed patch_httplib()
- Fixed :issue:`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



Release 1.0a3 (Sep 15, 2011)
============================

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 :exc:`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.


Release 1.0a2 (Aug 2, 2011)
===========================

Fixed a bug in gevent.queue.Channel class. (Thanks to Alexey Borzenkov)


Release 1.0a1 (Aug 2, 2011)
===========================

Backward-incompatible changes:

- Dropped support for Python 2.4.
- ``Queue(0)`` is now equivalent to an unbound queue and raises
  ``DeprecationError``. Use :class:`gevent.queue.Channel` if you
  need a channel.
- Deprecated ability to pass a greenlet instance to
  :meth:`Greenlet.link`, :meth:`Greenlet.link_value` and
  :meth:`Greenlet.link_exception`.
- All of :mod:`gevent.core` has been rewritten and the interface is
  not compatible.
- :exc:`SystemExit` and :exc:`SystemError` 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``.
- ``gevent.wsgi`` is now a deprecated alias for ``gevent.pywsgi``.

Release highlights:

- The :mod:`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 :mod:`signal` works now as expected.
- The unhandled errors are now handled uniformely by ``Hub.handle_error`` function.
- Added :class:`gevent.queue.Channel` class to :mod:`gevent.queue` module. It is
  equivalent to ``Queue(0)`` in gevent 0.x, which is deprecated now.
- Added method ``peek`` to :class:`gevent.queue.Queue` 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 of ``gevent.ares``.

The :mod:`gevent.socket` module:

- DNS functions now use c-ares library rather than libevent-dns. This
  fixes a number of problems with name resolving:

  - Fix :issue:`2`: DNS resolver no longer breaks after ``fork()``. You
    still need to call :func:`gevent.fork` (`os.fork` is monkey
    patched with it if ``monkey.patch_all()`` was called).
  - 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 :class:`gevent.hub.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 :class:`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`` and ``imap`` 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 :func:`gevent.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.