@@ -1362,13 +1362,135 @@ def test_closed_queue_put_get_exceptions(self):
1362
1362
1363
1363
class _TestLock (BaseTestCase ):
1364
1364
1365
+ @staticmethod
1366
+ def _acquire (lock , l = None ):
1367
+ lock .acquire ()
1368
+ if l is not None :
1369
+ l .append (repr (lock ))
1370
+
1371
+ @staticmethod
1372
+ def _acquire_event (lock , event ):
1373
+ lock .acquire ()
1374
+ event .set ()
1375
+ time .sleep (1.0 )
1376
+
1377
+ def test_repr_lock (self ):
1378
+ if self .TYPE != 'processes' :
1379
+ self .skipTest ('test not appropriate for {}' .format (self .TYPE ))
1380
+
1381
+ lock = self .Lock ()
1382
+ self .assertEqual (f'<Lock(owner=None)>' , repr (lock ))
1383
+
1384
+ lock .acquire ()
1385
+ self .assertEqual (f'<Lock(owner=MainProcess)>' , repr (lock ))
1386
+ lock .release ()
1387
+
1388
+ tname = 'T1'
1389
+ l = []
1390
+ t = threading .Thread (target = self ._acquire ,
1391
+ args = (lock , l ),
1392
+ name = tname )
1393
+ t .start ()
1394
+ time .sleep (0.1 )
1395
+ self .assertEqual (f'<Lock(owner=MainProcess|{ tname } )>' , l [0 ])
1396
+ lock .release ()
1397
+
1398
+ t = threading .Thread (target = self ._acquire ,
1399
+ args = (lock ,),
1400
+ name = tname )
1401
+ t .start ()
1402
+ time .sleep (0.1 )
1403
+ self .assertEqual ('<Lock(owner=SomeOtherThread)>' , repr (lock ))
1404
+ lock .release ()
1405
+
1406
+ pname = 'P1'
1407
+ l = multiprocessing .Manager ().list ()
1408
+ p = self .Process (target = self ._acquire ,
1409
+ args = (lock , l ),
1410
+ name = pname )
1411
+ p .start ()
1412
+ p .join ()
1413
+ self .assertEqual (f'<Lock(owner={ pname } )>' , l [0 ])
1414
+
1415
+ lock = self .Lock ()
1416
+ event = self .Event ()
1417
+ p = self .Process (target = self ._acquire_event ,
1418
+ args = (lock , event ),
1419
+ name = 'P2' )
1420
+ p .start ()
1421
+ event .wait ()
1422
+ self .assertEqual (f'<Lock(owner=SomeOtherProcess)>' , repr (lock ))
1423
+ p .terminate ()
1424
+
1365
1425
def test_lock (self ):
1366
1426
lock = self .Lock ()
1367
1427
self .assertEqual (lock .acquire (), True )
1368
1428
self .assertEqual (lock .acquire (False ), False )
1369
1429
self .assertEqual (lock .release (), None )
1370
1430
self .assertRaises ((ValueError , threading .ThreadError ), lock .release )
1371
1431
1432
+ @staticmethod
1433
+ def _acquire_release (lock , timeout , l = None , n = 1 ):
1434
+ for _ in range (n ):
1435
+ lock .acquire ()
1436
+ if l is not None :
1437
+ l .append (repr (lock ))
1438
+ time .sleep (timeout )
1439
+ for _ in range (n ):
1440
+ lock .release ()
1441
+
1442
+ def test_repr_rlock (self ):
1443
+ if self .TYPE != 'processes' :
1444
+ self .skipTest ('test not appropriate for {}' .format (self .TYPE ))
1445
+
1446
+ lock = self .RLock ()
1447
+ self .assertEqual ('<RLock(None, 0)>' , repr (lock ))
1448
+
1449
+ n = 3
1450
+ for _ in range (n ):
1451
+ lock .acquire ()
1452
+ self .assertEqual (f'<RLock(MainProcess, { n } )>' , repr (lock ))
1453
+ for _ in range (n ):
1454
+ lock .release ()
1455
+
1456
+ t , l = [], []
1457
+ for i in range (n ):
1458
+ t .append (threading .Thread (target = self ._acquire_release ,
1459
+ args = (lock , 0.1 , l , i + 1 ),
1460
+ name = f'T{ i + 1 } ' ))
1461
+ t [- 1 ].start ()
1462
+ for t_ in t :
1463
+ t_ .join ()
1464
+ for i in range (n ):
1465
+ self .assertIn (f'<RLock(MainProcess|T{ i + 1 } , { i + 1 } )>' , l )
1466
+
1467
+
1468
+ t = threading .Thread (target = self ._acquire_release ,
1469
+ args = (lock , 0.2 ),
1470
+ name = f'T1' )
1471
+ t .start ()
1472
+ time .sleep (0.1 )
1473
+ self .assertEqual ('<RLock(SomeOtherThread, nonzero)>' , repr (lock ))
1474
+ time .sleep (0.2 )
1475
+
1476
+ pname = 'P1'
1477
+ l = multiprocessing .Manager ().list ()
1478
+ p = self .Process (target = self ._acquire_release ,
1479
+ args = (lock , 0.1 , l ),
1480
+ name = pname )
1481
+ p .start ()
1482
+ p .join ()
1483
+ self .assertEqual (f'<RLock({ pname } , 1)>' , l [0 ])
1484
+
1485
+ event = self .Event ()
1486
+ lock = self .RLock ()
1487
+ p = self .Process (target = self ._acquire_event ,
1488
+ args = (lock , event ))
1489
+ p .start ()
1490
+ event .wait ()
1491
+ self .assertEqual ('<RLock(SomeOtherProcess, nonzero)>' , repr (lock ))
1492
+ p .join ()
1493
+
1372
1494
def test_rlock (self ):
1373
1495
lock = self .RLock ()
1374
1496
self .assertEqual (lock .acquire (), True )
0 commit comments