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