2019-11-30 02:07:30 +01:00
|
|
|
import time
|
|
|
|
|
2019-11-19 02:16:20 +01:00
|
|
|
import gevent
|
|
|
|
|
|
|
|
from util import ThreadPool
|
|
|
|
|
|
|
|
|
|
|
|
class TestThreadPool:
|
|
|
|
def testExecutionOrder(self):
|
|
|
|
pool = ThreadPool.ThreadPool(4)
|
|
|
|
|
|
|
|
events = []
|
|
|
|
|
|
|
|
@pool.wrap
|
|
|
|
def blocker():
|
|
|
|
events.append("S")
|
|
|
|
out = 0
|
2019-11-19 02:25:28 +01:00
|
|
|
for i in range(10000000):
|
2019-12-11 20:04:39 +01:00
|
|
|
if i == 3000000:
|
2019-11-30 02:07:40 +01:00
|
|
|
events.append("M")
|
2019-11-19 02:16:20 +01:00
|
|
|
out += 1
|
|
|
|
events.append("D")
|
|
|
|
return out
|
|
|
|
|
|
|
|
threads = []
|
2019-12-11 20:04:39 +01:00
|
|
|
for i in range(2):
|
2019-11-19 02:16:20 +01:00
|
|
|
threads.append(gevent.spawn(blocker))
|
|
|
|
gevent.joinall(threads)
|
|
|
|
|
2019-12-11 20:04:39 +01:00
|
|
|
assert events == ["S"] * 2 + ["M"] * 2 + ["D"] * 2
|
2019-11-19 02:16:20 +01:00
|
|
|
|
|
|
|
res = blocker()
|
2019-11-19 02:25:28 +01:00
|
|
|
assert res == 10000000
|
2019-11-30 02:07:30 +01:00
|
|
|
|
|
|
|
def testLockBlockingSameThread(self):
|
|
|
|
from gevent.lock import Semaphore
|
|
|
|
|
|
|
|
lock = Semaphore()
|
|
|
|
|
|
|
|
s = time.time()
|
|
|
|
|
|
|
|
def unlocker():
|
|
|
|
time.sleep(1)
|
|
|
|
lock.release()
|
|
|
|
|
|
|
|
gevent.spawn(unlocker)
|
|
|
|
lock.acquire(True)
|
|
|
|
lock.acquire(True, timeout=2)
|
|
|
|
|
|
|
|
unlock_taken = time.time() - s
|
|
|
|
|
|
|
|
assert 1.0 < unlock_taken < 1.5
|
|
|
|
|
|
|
|
def testLockBlockingDifferentThread(self):
|
|
|
|
lock = ThreadPool.Lock()
|
|
|
|
|
|
|
|
s = time.time()
|
|
|
|
|
|
|
|
def locker():
|
|
|
|
lock.acquire(True)
|
|
|
|
time.sleep(1)
|
|
|
|
lock.release()
|
|
|
|
|
|
|
|
pool = gevent.threadpool.ThreadPool(10)
|
|
|
|
pool.spawn(locker)
|
|
|
|
threads = [
|
|
|
|
pool.spawn(locker),
|
|
|
|
]
|
|
|
|
time.sleep(0.1)
|
|
|
|
|
|
|
|
lock.acquire(True, 5.0)
|
|
|
|
|
|
|
|
unlock_taken = time.time() - s
|
|
|
|
|
|
|
|
assert 2.0 < unlock_taken < 2.5
|
|
|
|
|
|
|
|
gevent.joinall(threads)
|