免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1034 | 回复: 3
打印 上一主题 下一主题

python lock 同步问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-08-29 23:43 |只看该作者 |倒序浏览
请教各位大神,如果两个线程同时去做 lock.acquire() ,都可以成功,从而导致同步问题。
是我代码有误吗? 还是python线程有Lock的个数限制 (实际代码中有多个lock)
示例代码如下:  (估计要去掉sleep的代码/加大range范围才会跑出来)

  1. import sys, os, re, time
  2. import threading

  3. class sockThd(threading.Thread):
  4.     def __init__(self):
  5.         self.lock=threading.Semaphore()
  6.         #self.lock=threading.Lock()
  7.         threading.Thread.__init__(self)
  8.          
  9.     def recv_func(self, id):
  10.         print "before acquire:recv_func(): " + str(id)
  11.         self.lock.acquire()
  12.         print "after acquire:recv_func(): " + str(id)
  13.         time.sleep(1.2)
  14.         print "before release:recv_func(): " + str(id)
  15.         self.lock.release()
  16.          
  17.     def send_func(self, id):
  18.         print "before acquire:send_func(): " + str(id)
  19.         self.lock.acquire()
  20.         print "after acquire:send_func(): " + str(id)
  21.         time.sleep(2)
  22.         print "before release:send_func(): " + str(id)
  23.         self.lock.release()
  24.          
  25.     def run(self):
  26.         for i in range(5):
  27.             self.recv_func(i)
  28.             self.lock.acquire()
  29.             print "after acquire:sock: run(): " + str(i)
  30.             time.sleep(0.7)
  31.             print "before release:sock: run(): " + str(i)
  32.             self.lock.release()                       

  33. def fileEntry():
  34.     global sth
  35.     for i in range(6):
  36.         print "file: run(0): " + str(i)
  37.         sth.send_func(i)
  38.         print "file: run(1): " + str(i)
  39.         time.sleep(1)
  40.             
  41. def main():
  42.     global sth
  43.     sth = sockThd()
  44.     fth = threading.Thread(target=fileEntry, args=())
  45.     sth.start()
  46.     fth.start()
  47.     sth.join()
  48.     fth.join()
  49.      
  50.      
  51. if __name__ == '__main__':
  52.     main()
复制代码

论坛徽章:
0
2 [报告]
发表于 2016-08-30 12:58 |只看该作者
运行了你的结果,问题在哪,请指出。

  1. $ python thread.py
  2. before acquire:recv_func(): 0
  3. after acquire:recv_func(): 0
  4. file: run(0): 0
  5. before acquire:send_func(): 0
  6. before release:recv_func(): 0
  7. after acquire:sock: run(): 0
  8. before release:sock: run(): 0
  9. before acquire:recv_func(): 1
  10. after acquire:recv_func(): 1
  11. before release:recv_func(): 1
  12. after acquire:sock: run(): 1
  13. before release:sock: run(): 1
  14. before acquire:recv_func(): 2
  15. after acquire:recv_func(): 2
  16. before release:recv_func(): 2
  17. after acquire:sock: run(): 2
  18. before release:sock: run(): 2
  19. before acquire:recv_func(): 3
  20. after acquire:recv_func(): 3
  21. before release:recv_func(): 3
  22. after acquire:sock: run(): 3
  23. before release:sock: run(): 3
  24. before acquire:recv_func(): 4
  25. after acquire:recv_func(): 4
  26. before release:recv_func(): 4
  27. after acquire:sock: run(): 4
  28. before release:sock: run(): 4
  29. after acquire:send_func(): 0
  30. before release:send_func(): 0
  31. file: run(1): 0
  32. file: run(0): 1
  33. before acquire:send_func(): 1
  34. after acquire:send_func(): 1
  35. before release:send_func(): 1
  36. file: run(1): 1
  37. file: run(0): 2
  38. before acquire:send_func(): 2
  39. after acquire:send_func(): 2
  40. before release:send_func(): 2
  41. file: run(1): 2
  42. file: run(0): 3
  43. before acquire:send_func(): 3
  44. after acquire:send_func(): 3
  45. before release:send_func(): 3
  46. file: run(1): 3
  47. file: run(0): 4
  48. before acquire:send_func(): 4
  49. after acquire:send_func(): 4
  50. before release:send_func(): 4
  51. file: run(1): 4
  52. file: run(0): 5
  53. before acquire:send_func(): 5
  54. after acquire:send_func(): 5
  55. before release:send_func(): 5
  56. file: run(1): 5
复制代码

论坛徽章:
0
3 [报告]
发表于 2016-08-30 13:47 |只看该作者
回复 2# Hadron74

示例代码如下:  (估计要去掉sleep的代码/加大range范围才会跑出来)

示例代码不一定能跑出 两个线程同时acquire的状况


论坛徽章:
0
4 [报告]
发表于 2016-08-30 14:05 |只看该作者
回复 3# ytmayer

我 试了 去除 sleep, 加到1600, 没有报错。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP