Merging with the latest eventlet tip
This commit is contained in:
@@ -19,10 +19,3 @@ EVENTLET_THREADPOOL_SIZE
|
|||||||
The size of the threadpool in :mod:`~eventlet.tpool`. This is an
|
The size of the threadpool in :mod:`~eventlet.tpool`. This is an
|
||||||
environment variable because tpool constructs its pool on first
|
environment variable because tpool constructs its pool on first
|
||||||
use, so any control of the pool size needs to happen before then.
|
use, so any control of the pool size needs to happen before then.
|
||||||
|
|
||||||
EVENTLET_TPOOL_DNS
|
|
||||||
|
|
||||||
If set to 'yes', uses :func:`eventlet.tpool.execute` to call
|
|
||||||
:func:`~socket.gethostbyname` and :func:`~socket.getaddrinfo`,
|
|
||||||
making them appear non-blocking. This environment variable is
|
|
||||||
ignored on OS X.
|
|
||||||
|
@@ -18,46 +18,9 @@ if os.environ.get("EVENTLET_NO_GREENDNS",'').lower() != "yes":
|
|||||||
except ImportError, ex:
|
except ImportError, ex:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
__original_gethostbyname__ = __socket.gethostbyname
|
if greendns:
|
||||||
# the thread primitives on Darwin have some bugs that make
|
|
||||||
# it undesirable to use tpool for hostname lookups
|
|
||||||
_can_use_tpool = (
|
|
||||||
os.environ.get("EVENTLET_TPOOL_DNS",'').lower() == "yes"
|
|
||||||
and not sys.platform.startswith('darwin'))
|
|
||||||
def _gethostbyname_twisted(name):
|
|
||||||
from twisted.internet import reactor
|
|
||||||
from eventlet.twistedutil import block_on as _block_on
|
|
||||||
return _block_on(reactor.resolve(name))
|
|
||||||
|
|
||||||
def _gethostbyname_tpool(name):
|
|
||||||
from eventlet import tpool
|
|
||||||
return tpool.execute(
|
|
||||||
__original_gethostbyname__, name)
|
|
||||||
|
|
||||||
if getattr(get_hub(), 'uses_twisted_reactor', None):
|
|
||||||
gethostbyname = _gethostbyname_twisted
|
|
||||||
elif greendns:
|
|
||||||
gethostbyname = greendns.gethostbyname
|
gethostbyname = greendns.gethostbyname
|
||||||
elif _can_use_tpool:
|
|
||||||
gethostbyname = _gethostbyname_tpool
|
|
||||||
else:
|
|
||||||
gethostbyname = __original_gethostbyname__
|
|
||||||
|
|
||||||
|
|
||||||
__original_getaddrinfo__ = __socket.getaddrinfo
|
|
||||||
def _getaddrinfo_tpool(*args, **kw):
|
|
||||||
from eventlet import tpool
|
|
||||||
return tpool.execute(
|
|
||||||
__original_getaddrinfo__, *args, **kw)
|
|
||||||
|
|
||||||
if greendns:
|
|
||||||
getaddrinfo = greendns.getaddrinfo
|
getaddrinfo = greendns.getaddrinfo
|
||||||
elif _can_use_tpool:
|
|
||||||
getaddrinfo = _getaddrinfo_tpool
|
|
||||||
else:
|
|
||||||
getaddrinfo = __original_getaddrinfo__
|
|
||||||
|
|
||||||
if greendns:
|
|
||||||
gethostbyname_ex = greendns.gethostbyname_ex
|
gethostbyname_ex = greendns.gethostbyname_ex
|
||||||
getnameinfo = greendns.getnameinfo
|
getnameinfo = greendns.getnameinfo
|
||||||
__patched__ = __patched__ + ['gethostbyname_ex', 'getnameinfo']
|
__patched__ = __patched__ + ['gethostbyname_ex', 'getnameinfo']
|
||||||
|
51
tests/fork_test.py
Normal file
51
tests/fork_test.py
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
from tests.patcher_test import ProcessBase
|
||||||
|
|
||||||
|
|
||||||
|
class ForkTest(ProcessBase):
|
||||||
|
def test_simple(self):
|
||||||
|
newmod = '''
|
||||||
|
import eventlet
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import signal
|
||||||
|
mydir = %r
|
||||||
|
signal_file = os.path.join(mydir, "output.txt")
|
||||||
|
pid = os.fork()
|
||||||
|
if (pid != 0):
|
||||||
|
eventlet.Timeout(10)
|
||||||
|
try:
|
||||||
|
port = None
|
||||||
|
while True:
|
||||||
|
try:
|
||||||
|
contents = open(signal_file, "rb").read()
|
||||||
|
port = int(contents.split()[0])
|
||||||
|
break
|
||||||
|
except (IOError, IndexError, ValueError, TypeError):
|
||||||
|
eventlet.sleep(0.1)
|
||||||
|
eventlet.connect(('127.0.0.1', port))
|
||||||
|
while True:
|
||||||
|
try:
|
||||||
|
contents = open(signal_file, "rb").read()
|
||||||
|
result = contents.split()[1]
|
||||||
|
break
|
||||||
|
except (IOError, IndexError):
|
||||||
|
eventlet.sleep(0.1)
|
||||||
|
print 'result', result
|
||||||
|
finally:
|
||||||
|
os.kill(pid, signal.SIGTERM)
|
||||||
|
else:
|
||||||
|
try:
|
||||||
|
s = eventlet.listen(('', 0))
|
||||||
|
fd = open(signal_file, "wb")
|
||||||
|
fd.write(str(s.getsockname()[1]))
|
||||||
|
fd.write("\\n")
|
||||||
|
fd.flush()
|
||||||
|
s.accept()
|
||||||
|
fd.write("done")
|
||||||
|
fd.flush()
|
||||||
|
finally:
|
||||||
|
fd.close()
|
||||||
|
'''
|
||||||
|
self.write_to_tempfile("newmod", newmod % self.tempdir)
|
||||||
|
output, lines = self.launch_subprocess('newmod.py')
|
||||||
|
self.assertEqual(lines[0], "result done", output)
|
Reference in New Issue
Block a user