
Because first GreenPool.spawn() sometimes takes 200+ms which is a bug not related to this test. https://github.com/eventlet/eventlet/issues/374 https://github.com/eventlet/eventlet/issues/379
51 lines
1.4 KiB
Python
51 lines
1.4 KiB
Python
__test__ = False
|
|
|
|
if __name__ == '__main__':
|
|
import eventlet
|
|
eventlet.monkey_patch(all=True)
|
|
import socket
|
|
import time
|
|
import dns.message
|
|
import dns.query
|
|
|
|
n = 10
|
|
delay = 0.01
|
|
addr_map = {'test-host{0}.'.format(i): '0.0.1.{0}'.format(i) for i in range(n)}
|
|
|
|
def slow_udp(q, *a, **kw):
|
|
qname = q.question[0].name
|
|
addr = addr_map[qname.to_text().decode()]
|
|
r = dns.message.make_response(q)
|
|
r.index = None
|
|
r.flags = 256
|
|
r.answer.append(dns.rrset.from_text(str(qname), 60, 'IN', 'A', addr))
|
|
r.time = 0.001
|
|
eventlet.sleep(delay)
|
|
return r
|
|
|
|
dns.query.tcp = lambda: eventlet.Timeout(0)
|
|
dns.query.udp = slow_udp
|
|
results = {}
|
|
|
|
def fun(name):
|
|
try:
|
|
results[name] = socket.gethostbyname(name)
|
|
except socket.error as e:
|
|
print('name: {0} error: {1}'.format(name, e))
|
|
|
|
pool = eventlet.GreenPool(size=n + 1)
|
|
|
|
# FIXME: For unknown reason, first GreenPool.spawn() takes ~250ms on some platforms.
|
|
# Spawned function executes for normal expected time, it's the GreenPool who needs warmup.
|
|
pool.spawn(eventlet.sleep)
|
|
|
|
t1 = time.time()
|
|
for name in addr_map:
|
|
pool.spawn(fun, name)
|
|
pool.waitall()
|
|
td = time.time() - t1
|
|
fail_msg = 'Resolve time expected: ~{0:.3f}s, real: {1:.3f}'.format(delay, td)
|
|
assert delay <= td < delay * n, fail_msg
|
|
assert addr_map == results
|
|
print('pass')
|