@@ -349,8 +349,7 @@ class Event:
349
349
350
350
def __init__ (self , value : bool = False ) -> None :
351
351
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
354
353
355
354
def __repr__ (self ) -> str :
356
355
res = super ().__repr__ ()
@@ -360,55 +359,51 @@ def __repr__(self) -> str:
360
359
return f"<{ res [1 :- 1 ]} [{ extra } ]>"
361
360
362
361
def is_set (self ) -> bool :
363
- with self ._lock :
364
- return self ._value
362
+ return self ._value [0 ]
365
363
366
364
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
370
367
371
- while self ._waiters :
372
- fut = self ._waiters .popleft ()
368
+ while self ._waiters :
369
+ fut = self ._waiters .popleft ()
373
370
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 :
379
376
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 ()
386
383
387
- done = threading .Event ()
384
+ done = threading .Event ()
388
385
389
- fut .get_loop ().call_soon_threadsafe (set_result , fut , done )
386
+ fut .get_loop ().call_soon_threadsafe (set_result , fut , done )
390
387
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 ()
394
391
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
398
395
399
- time .sleep (0.001 )
396
+ time .sleep (0.001 )
400
397
401
398
def clear (self ) -> None :
402
- with self ._lock :
403
- self ._value = False
399
+ self ._value [0 ] = False
404
400
405
401
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
409
404
410
- fut = create_sub_future ()
411
- self ._waiters .append (fut )
405
+ fut = create_sub_future ()
406
+ self ._waiters .append (fut )
412
407
413
408
try :
414
409
await asyncio .wait_for (fut , timeout )
0 commit comments