Fixed a buncha things noticed during a code review.
This commit is contained in:
13
NEWS
13
NEWS
@@ -1,21 +1,24 @@
|
|||||||
0.9.3
|
0.9.3
|
||||||
=====
|
=====
|
||||||
|
|
||||||
|
* tpooled gethostbyname is configurable via environment variable EVENTLET_TPOOL_GETHOSTBYNAME
|
||||||
|
* Removed greenio.Green_fileobject and refactored the code therein to be more efficient. Only call makefile() on sockets now; makeGreenFile() is deprecated. The main loss here is that of the readuntil method. Also, Green_fileobjects used to be auto-flushing; flush() must be called explicitly now.
|
||||||
|
* Improved documentation across the board.
|
||||||
* New debug module, used for enabling verbosity within Eventlet that can help debug applications or Eventlet itself.
|
* New debug module, used for enabling verbosity within Eventlet that can help debug applications or Eventlet itself.
|
||||||
* Bugfixes in tpool, green.select
|
* Bugfixes in tpool, green.select, patcher
|
||||||
* Moved primary api module to __init__ from api. It shouldn't be necessary to import eventlet.api anymore; import eventlet should do the same job.
|
* Moved primary api module to __init__ from api. It shouldn't be necessary to import eventlet.api anymore; import eventlet should do the same job.
|
||||||
* Proc module deprecated in favor of greenthread
|
* Proc module deprecated in favor of greenthread
|
||||||
* New module greenthread, with new class GreenThread.
|
* New module greenthread, with new class GreenThread.
|
||||||
* New GreenPool class that replaces pool.Pool.
|
* New GreenPool class that replaces pool.Pool.
|
||||||
* Deprecated coros.execute
|
* Deprecated Proc module (use greenthread module instead)
|
||||||
* Deprecated coros.semaphore
|
* Deprecated coros.execute (use eventlet.spawn instead)
|
||||||
|
* Deprecated coros.semaphore (use semaphore.Semaphore or semaphore.BoundedSemaphore instead)
|
||||||
* Moved coros.BoundedSemaphore to semaphore.BoundedSemaphore
|
* Moved coros.BoundedSemaphore to semaphore.BoundedSemaphore
|
||||||
* Moved coros.Semaphore to semaphore.Semaphore
|
* Moved coros.Semaphore to semaphore.Semaphore
|
||||||
* Moved coros.event to event.Event
|
* Moved coros.event to event.Event
|
||||||
* Deprecated api.tcp_listener, api.connect_tcp, api.ssl_listener
|
* Deprecated api.tcp_listener, api.connect_tcp, api.ssl_listener
|
||||||
* Moved get_hub, use_hub, get_default_hub to eventlet.hubs
|
* Moved get_hub, use_hub, get_default_hub from eventlet.api to eventlet.hubs
|
||||||
* Renamed libevent hub to pyevent.
|
* Renamed libevent hub to pyevent.
|
||||||
* Renamed coros.event to coros.Event
|
|
||||||
* Removed previously-deprecated features tcp_server, GreenSSL, erpc, and trap_errors.
|
* Removed previously-deprecated features tcp_server, GreenSSL, erpc, and trap_errors.
|
||||||
* Removed saranwrap as an option for making db connections nonblocking in db_pool.
|
* Removed saranwrap as an option for making db connections nonblocking in db_pool.
|
||||||
|
|
||||||
|
@@ -12,12 +12,14 @@ Eventlet on top of twisted provides:
|
|||||||
* existing twisted code can be used without any changes
|
* existing twisted code can be used without any changes
|
||||||
* existing blocking code can be used after trivial changes applied
|
* existing blocking code can be used after trivial changes applied
|
||||||
|
|
||||||
|
NOTE: the maintainer of Eventlet's Twisted support no longer supports it; it still exists but may have had some breakage along the way. Please treat it as experimental, and if you'd like to maintain it, please do!
|
||||||
|
|
||||||
Eventlet features:
|
Eventlet features:
|
||||||
|
|
||||||
* utilities for spawning and controlling greenlet execution:
|
* utilities for spawning and controlling greenlet execution:
|
||||||
api.spawn, api.kill, proc module
|
api.spawn, api.kill, proc module
|
||||||
* utilities for communicating between greenlets:
|
* utilities for communicating between greenlets:
|
||||||
coros.Event, coros.Queue, proc module
|
event.Event, queue.Queue, semaphore.Semaphore
|
||||||
* standard Python modules that won't block the reactor:
|
* standard Python modules that won't block the reactor:
|
||||||
eventlet.green package
|
eventlet.green package
|
||||||
* utilities specific to twisted hub:
|
* utilities specific to twisted hub:
|
||||||
@@ -61,8 +63,8 @@ to call from anywhere:
|
|||||||
1. Greenlet creation functions: api.spawn, proc.spawn,
|
1. Greenlet creation functions: api.spawn, proc.spawn,
|
||||||
twistedutil.deferToGreenThread and others based on api.spawn.
|
twistedutil.deferToGreenThread and others based on api.spawn.
|
||||||
|
|
||||||
2. send(), send_exception(), poll(), ready() methods of coros.Event
|
2. send(), send_exception(), poll(), ready() methods of event.Event
|
||||||
and coros.Queue.
|
and queue.Queue.
|
||||||
|
|
||||||
3. wait(timeout=0) is identical to poll(). Currently only Proc.wait
|
3. wait(timeout=0) is identical to poll(). Currently only Proc.wait
|
||||||
supports timeout parameter.
|
supports timeout parameter.
|
||||||
|
@@ -9,7 +9,7 @@ from twisted.python import failure
|
|||||||
from eventlet import proc
|
from eventlet import proc
|
||||||
from eventlet.api import getcurrent
|
from eventlet.api import getcurrent
|
||||||
from eventlet.coros import Queue
|
from eventlet.coros import Queue
|
||||||
from eventlet.event import Event
|
from eventlet.event import Event as BaseEvent
|
||||||
|
|
||||||
|
|
||||||
class ValueQueue(Queue):
|
class ValueQueue(Queue):
|
||||||
@@ -37,17 +37,17 @@ class ValueQueue(Queue):
|
|||||||
return self.items and self.items[-1][1] is not None
|
return self.items and self.items[-1][1] is not None
|
||||||
|
|
||||||
|
|
||||||
class Event(Event):
|
class Event(BaseEvent):
|
||||||
|
|
||||||
def send(self, value, exc=None):
|
def send(self, value, exc=None):
|
||||||
if self.ready():
|
if self.ready():
|
||||||
self.reset()
|
self.reset()
|
||||||
return Event.send(self, value, exc)
|
return BaseEvent.send(self, value, exc)
|
||||||
|
|
||||||
def send_exception(self, *throw_args):
|
def send_exception(self, *throw_args):
|
||||||
if self.ready():
|
if self.ready():
|
||||||
self.reset()
|
self.reset()
|
||||||
return Event.send_exception(self, *throw_args)
|
return BaseEvent.send_exception(self, *throw_args)
|
||||||
|
|
||||||
class Producer2Event(object):
|
class Producer2Event(object):
|
||||||
|
|
||||||
|
@@ -2,7 +2,8 @@
|
|||||||
|
|
||||||
from tests import skipped, skip_unless
|
from tests import skipped, skip_unless
|
||||||
from unittest import TestCase, main
|
from unittest import TestCase, main
|
||||||
from eventlet import api, coros
|
from eventlet import api
|
||||||
|
from eventlet import event
|
||||||
from eventlet import db_pool
|
from eventlet import db_pool
|
||||||
|
|
||||||
class DBTester(object):
|
class DBTester(object):
|
||||||
@@ -146,13 +147,13 @@ class TestDBConnectionPool(DBTester):
|
|||||||
curs = conn.cursor()
|
curs = conn.cursor()
|
||||||
results = []
|
results = []
|
||||||
SHORT_QUERY = "select * from test_table"
|
SHORT_QUERY = "select * from test_table"
|
||||||
evt = coros.Event()
|
evt = event.Event()
|
||||||
def a_query():
|
def a_query():
|
||||||
self.assert_cursor_works(curs)
|
self.assert_cursor_works(curs)
|
||||||
curs.execute(SHORT_QUERY)
|
curs.execute(SHORT_QUERY)
|
||||||
results.append(2)
|
results.append(2)
|
||||||
evt.send()
|
evt.send()
|
||||||
evt2 = coros.Event()
|
evt2 = event.Event()
|
||||||
api.spawn(a_query)
|
api.spawn(a_query)
|
||||||
results.append(1)
|
results.append(1)
|
||||||
self.assertEqual([1], results)
|
self.assertEqual([1], results)
|
||||||
@@ -223,13 +224,13 @@ class TestDBConnectionPool(DBTester):
|
|||||||
LONG_QUERY = "select * from test_table"
|
LONG_QUERY = "select * from test_table"
|
||||||
SHORT_QUERY = "select * from test_table where row_id <= 20"
|
SHORT_QUERY = "select * from test_table where row_id <= 20"
|
||||||
|
|
||||||
evt = coros.Event()
|
evt = event.Event()
|
||||||
def long_running_query():
|
def long_running_query():
|
||||||
self.assert_cursor_works(curs)
|
self.assert_cursor_works(curs)
|
||||||
curs.execute(LONG_QUERY)
|
curs.execute(LONG_QUERY)
|
||||||
results.append(1)
|
results.append(1)
|
||||||
evt.send()
|
evt.send()
|
||||||
evt2 = coros.Event()
|
evt2 = event.Event()
|
||||||
def short_running_query():
|
def short_running_query():
|
||||||
self.assert_cursor_works(curs2)
|
self.assert_cursor_works(curs2)
|
||||||
curs2.execute(SHORT_QUERY)
|
curs2.execute(SHORT_QUERY)
|
||||||
@@ -373,7 +374,7 @@ class TestDBConnectionPool(DBTester):
|
|||||||
conn = self.pool.get()
|
conn = self.pool.get()
|
||||||
self.assertEquals(self.pool.free(), 0)
|
self.assertEquals(self.pool.free(), 0)
|
||||||
self.assertEquals(self.pool.waiting(), 0)
|
self.assertEquals(self.pool.waiting(), 0)
|
||||||
e = coros.Event()
|
e = event.Event()
|
||||||
def retrieve(pool, ev):
|
def retrieve(pool, ev):
|
||||||
c = pool.get()
|
c = pool.get()
|
||||||
ev.send(c)
|
ev.send(c)
|
||||||
|
Reference in New Issue
Block a user