Skip to content

Commit f4f8c69

Browse files
committed
chore: optimize async event
1 parent 1bf7680 commit f4f8c69

File tree

1 file changed

+31
-36
lines changed

1 file changed

+31
-36
lines changed

robotcode/utils/async_tools.py

Lines changed: 31 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -349,8 +349,7 @@ class Event:
349349

350350
def __init__(self, value: bool = False) -> None:
351351
self._waiters: Deque[asyncio.Future[Any]] = deque()
352-
self._value = value
353-
self._lock = threading.RLock()
352+
self._value = [value] # make value atomic according to GIL
354353

355354
def __repr__(self) -> str:
356355
res = super().__repr__()
@@ -360,55 +359,51 @@ def __repr__(self) -> str:
360359
return f"<{res[1:-1]} [{extra}]>"
361360

362361
def is_set(self) -> bool:
363-
with self._lock:
364-
return self._value
362+
return self._value[0]
365363

366364
def set(self) -> None:
367-
with self._lock:
368-
if not self._value:
369-
self._value = True
365+
if not self._value[0]:
366+
self._value[0] = True
370367

371-
while self._waiters:
372-
fut = self._waiters.popleft()
368+
while self._waiters:
369+
fut = self._waiters.popleft()
373370

374-
if not fut.done():
375-
if fut.get_loop() == asyncio.get_running_loop():
376-
if not fut.done():
377-
fut.set_result(True)
378-
else:
371+
if not fut.done():
372+
if fut.get_loop() == asyncio.get_running_loop():
373+
if not fut.done():
374+
fut.set_result(True)
375+
else:
379376

380-
def set_result(w: asyncio.Future[Any], ev: threading.Event) -> None:
381-
try:
382-
if not w.done():
383-
w.set_result(True)
384-
finally:
385-
ev.set()
377+
def set_result(w: asyncio.Future[Any], ev: threading.Event) -> None:
378+
try:
379+
if not w.done():
380+
w.set_result(True)
381+
finally:
382+
ev.set()
386383

387-
done = threading.Event()
384+
done = threading.Event()
388385

389-
fut.get_loop().call_soon_threadsafe(set_result, fut, done)
386+
fut.get_loop().call_soon_threadsafe(set_result, fut, done)
390387

391-
start = time.monotonic()
392-
while not done.is_set():
393-
check_canceled_sync()
388+
start = time.monotonic()
389+
while not done.is_set():
390+
check_canceled_sync()
394391

395-
if time.monotonic() - start > 120:
396-
warnings.warn("Can't set future result.")
397-
break
392+
if time.monotonic() - start > 120:
393+
warnings.warn("Can't set future result.")
394+
break
398395

399-
time.sleep(0.001)
396+
time.sleep(0.001)
400397

401398
def clear(self) -> None:
402-
with self._lock:
403-
self._value = False
399+
self._value[0] = False
404400

405401
async def wait(self, timeout: Optional[float] = None) -> bool:
406-
with self._lock:
407-
if self._value:
408-
return True
402+
if self._value[0]:
403+
return True
409404

410-
fut = create_sub_future()
411-
self._waiters.append(fut)
405+
fut = create_sub_future()
406+
self._waiters.append(fut)
412407

413408
try:
414409
await asyncio.wait_for(fut, timeout)

0 commit comments

Comments
 (0)