94 lines
2.3 KiB
Python
94 lines
2.3 KiB
Python
|
|
import py
|
|
import sys
|
|
|
|
WorkerPool = py._thread.WorkerPool
|
|
ThreadOut = py._thread.ThreadOut
|
|
|
|
def test_some():
|
|
pool = WorkerPool()
|
|
q = py.std.Queue.Queue()
|
|
num = 4
|
|
|
|
def f(i):
|
|
q.put(i)
|
|
while q.qsize():
|
|
py.std.time.sleep(0.01)
|
|
for i in range(num):
|
|
pool.dispatch(f, i)
|
|
for i in range(num):
|
|
q.get()
|
|
assert len(pool._alive) == 4
|
|
pool.shutdown()
|
|
# XXX I replaced the following join() with a time.sleep(1), which seems
|
|
# to fix the test on Windows, and doesn't break it on Linux... Completely
|
|
# unsure what the idea is, though, so it would be nice if someone with some
|
|
# more understanding of what happens here would either fix this better, or
|
|
# remove this comment...
|
|
# pool.join(timeout=1.0)
|
|
py.std.time.sleep(1)
|
|
assert len(pool._alive) == 0
|
|
assert len(pool._ready) == 0
|
|
|
|
def test_get():
|
|
pool = WorkerPool()
|
|
def f():
|
|
return 42
|
|
reply = pool.dispatch(f)
|
|
result = reply.get()
|
|
assert result == 42
|
|
|
|
def test_get_timeout():
|
|
pool = WorkerPool()
|
|
def f():
|
|
py.std.time.sleep(0.2)
|
|
return 42
|
|
reply = pool.dispatch(f)
|
|
py.test.raises(IOError, "reply.get(timeout=0.01)")
|
|
|
|
def test_get_excinfo():
|
|
pool = WorkerPool()
|
|
def f():
|
|
raise ValueError("42")
|
|
reply = pool.dispatch(f)
|
|
excinfo = py.test.raises(ValueError, "reply.get(1.0)")
|
|
py.test.raises(EOFError, "reply.get(1.0)")
|
|
|
|
def test_maxthreads():
|
|
pool = WorkerPool(maxthreads=1)
|
|
def f():
|
|
py.std.time.sleep(0.5)
|
|
try:
|
|
pool.dispatch(f)
|
|
py.test.raises(IOError, pool.dispatch, f)
|
|
finally:
|
|
pool.shutdown()
|
|
|
|
def test_join_timeout():
|
|
pool = WorkerPool()
|
|
q = py.std.Queue.Queue()
|
|
def f():
|
|
q.get()
|
|
reply = pool.dispatch(f)
|
|
pool.shutdown()
|
|
py.test.raises(IOError, pool.join, 0.01)
|
|
q.put(None)
|
|
reply.get(timeout=1.0)
|
|
pool.join(timeout=0.1)
|
|
|
|
def test_pool_clean_shutdown():
|
|
capture = py.io.StdCaptureFD()
|
|
pool = WorkerPool()
|
|
def f():
|
|
pass
|
|
pool.dispatch(f)
|
|
pool.dispatch(f)
|
|
pool.shutdown()
|
|
pool.join(timeout=1.0)
|
|
assert not pool._alive
|
|
assert not pool._ready
|
|
out, err = capture.reset()
|
|
print out
|
|
print >>sys.stderr, err
|
|
assert err == ''
|