1、多线程类的继承

  1. import threading
  2. import time
  3. class MyThreading(threading.Thread):
  4. def __init__(self,n):
  5. super(MyThreading,self).__init__()
  6. self.n = n
  7. def run(self):
  8. print("threading %s"%(self.n))
  9. time.sleep(2)
  10.  
  11. threading1 = MyThreading("%s" %(1))
  12. threading2 = MyThreading("%s" %(2))
  13. threading1.start()
  14. threading1.join() ## 1执行完才会执行2
  15. threading2.start()
  16.  
  17. E:\Users\xiajinqi\PycharmProjects\Atm\venv\Scripts\python.exe E:/Users/xiajinqi/PycharmProjects/Atm/test4.py
  18. threading 1
  19. threading 2
  20. 。。。。。。。

2、线程测试案例

  1. import threading
  2. import time
  3. class MyThreading(threading.Thread):
  4. def __init__(self,n):
  5. super(MyThreading,self).__init__()
  6. self.n = n
  7. def run(self):
  8. time.sleep(2)
  9. print("threading %s"%(self.n))
  10.  
  11. threading1 = MyThreading("%s" %(1))
  12. threading2 = MyThreading("%s" %(2))
  13. threading1.start()
  14. threading1.join() ## 1执行完才会执行2
  15. threading2.start()
  16.  
  17. print("main")
  18.  
  19. E:\Users\xiajinqi\PycharmProjects\Atm\venv\Scripts\python.exe E:/Users/xiajinqi/PycharmProjects/Atm/test4.py
  20. threading 1
  21. main
  22. threading 2

3、多线程时间测试案例

  1. import threading
  2. import time
  3. list = [ ]
  4. def run(i):
  5. print("test %s"%(i))
  6. time.sleep(2)
  7.  
  8. starttime = time.time()
  9. for i in range(1,50):
  10. t1 = threading.Thread(target=run,args=(i,))
  11. t1.start()
  12. list.append(t1)
  13.  
  14. for i in list :
  15. i.join()
  16.  
  17. print("end")
  18.  
  19. endtime = time.time()
  20. print("cost:", endtime-starttime)
  21.  
  22. E:\Users\xiajinqi\PycharmProjects\Atm\venv\Scripts\python.exe E:/Users/xiajinqi/PycharmProjects/Atm/test3.py
  23. test 1
  24. test 2
  25. test 3
  26. test 4
  27. test 5
  28. test 6
  29. test 7
  30. test 8
  31. test 9
  32. test 10
  33. test 11
  34. test 12
  35. test 13
  36. test 14
  37. test 15
  38. test 16
  39. test 17
  40. test 18
  41. test 19
  42. test 20
  43. test 21
  44. test 22
  45. test 23
  46. test 24
  47. test 25
  48. test 26
  49. test 27
  50. test 28
  51. test 29
  52. test 30
  53. test 31
  54. test 32
  55. test 33
  56. test 34
  57. test 35
  58. test 36
  59. test 37
  60. test 38
  61. test 39
  62. test 40
  63. test 41
  64. test 42
  65. test 43
  66. test 44
  67. test 45
  68. test 46
  69. test 47
  70. test 48
  71. test 49
  72. end
  73. cost: 2.007871150970459
  74.  
  75. Process finished with exit code 0

 4、守护线程概念,默认情况下为非守护线程,即主线程推出前,需要等待所有的非守护线程结束放可以推出。而守护线程就表示这个线程“不重要”,即主线程结束时候,无需等待守护线程是否执行完成。

  1. import threading
  2. import time
  3. list = [ ]
  4. def run(i):
  5. print("test %s"%(i))
  6. time.sleep(5)
  7. print("setDaemon end ")
  8.  
  9. starttime = time.time()
  10. for i in range(1,50):
  11. t1 = threading.Thread(target=run,args=(i,))
  12. # t1.setDaemon(True)
  13. t1.start()
  14. list.append(t1)
  15.  
  16. print("main end")
  17. E:\Users\xiajinqi\PycharmProjects\Atm\venv\Scripts\python.exe E:/Users/xiajinqi/PycharmProjects/Atm/test3.py
  18. test 1
  19. test 2
  20. test 3
  21. test 4
  22. test 5
  23. test 6
  24. test 7
  25. test 8
  26. test 9
  27. test 10
  28. test 11
  29. test 12
  30. test 13
  31. test 14
  32. test 15
  33. test 16
  34. test 17
  35. test 18
  36. test 19
  37. test 20
  38. test 21
  39. test 22
  40. test 23
  41. test 24
  42. test 25
  43. test 26
  44. test 27
  45. test 28
  46. test 29
  47. test 30
  48. test 31
  49. test 32
  50. test 33
  51. test 34
  52. test 35
  53. test 36
  54. test 37
  55. test 38
  56. test 39
  57. test 40
  58. test 41
  59. test 42
  60. test 43
  61. test 44
  62. test 45
  63. test 46
  64. test 47
  65. test 48
  66. test 49
  67. main end
  68. setDaemon end
  69. setDaemon end
  70. setDaemon end
  71. setDaemon end
  72. setDaemon end
  73. setDaemon end
  74. setDaemon end
  75. setDaemon end
  76. setDaemon end
  77. setDaemon end
  78. setDaemon end
  79. setDaemon end
  80. setDaemon end
  81. setDaemon end
  82. setDaemon end
  83. setDaemon end
  84. setDaemon end
  85. setDaemon end
  86. setDaemon end
  87. setDaemon end
  88. setDaemon end
  89. setDaemon end
  90. setDaemon end
  91. setDaemon end
  92. setDaemon end
  93. setDaemon end
  94. setDaemon end
  95. setDaemon end
  96. setDaemon end
  97. setDaemon end
  98. setDaemon end
  99. setDaemon end
  100. setDaemon end
  101. setDaemon end
  102. setDaemon end
  103. setDaemon end
  104. setDaemon end
  105. setDaemon end
  106. setDaemon end
  107. setDaemon end
  108. setDaemon end
  109. setDaemon end
  110. setDaemon end
  111. setDaemon end
  112. setDaemon end
  113. setDaemon end
  114. setDaemon end
  115. setDaemon end
  116. setDaemon end
  117.  
  118. Process finished with exit code 0
  119.  
  120. import threading
  121. import time
  122. list = [ ]
  123. def run(i):
  124. print("test %s"%(i))
  125. time.sleep(5)
  126. print("setDaemon end ")
  127.  
  128. starttime = time.time()
  129. for i in range(1,50):
  130. t1 = threading.Thread(target=run,args=(i,))
  131. t1.setDaemon(True)
  132. t1.start()
  133. list.append(t1)
  134.  
  135. print("main end")
  136.  
  137. E:\Users\xiajinqi\PycharmProjects\Atm\venv\Scripts\python.exe E:/Users/xiajinqi/PycharmProjects/Atm/test3.py
  138. test 1
  139. test 2
  140. test 3
  141. test 4
  142. test 5
  143. test 6
  144. test 7
  145. test 8
  146. test 9
  147. test 10
  148. test 11
  149. test 12
  150. test 13
  151. test 14
  152. test 15
  153. test 16
  154. test 17
  155. test 18
  156. test 19
  157. test 20
  158. test 21
  159. test 22
  160. test 23
  161. test 24
  162. test 25
  163. test 26
  164. test 27
  165. test 28
  166. test 29
  167. test 30
  168. test 31
  169. test 32
  170. test 33
  171. test 34
  172. test 35
  173. test 36
  174. test 37
  175. test 38
  176. test 39
  177. test 40
  178. test 41
  179. test 42
  180. test 43
  181. test 44
  182. test 45
  183. test 46
  184. test 47
  185. test 48
  186. test 49
  187. main end
  188.  
  189. Process finished with exit code 0

5、GIL 和线程锁。GIL就是一把全局排他锁。他的作用就是保证同一时刻只有一个线程可以执行代码,对多线程有较大影响。

  1. import threading
  2. import time
  3. lock = threading.Lock()
  4. list = [ ]
  5.  
  6. res = 0
  7. def run(i):
  8. # 在Python3.5中已经优化,结果都是50.在python2.7如果不加锁可能有一场
  9. lock.acquire()
  10. global res
  11. res = res + 1
  12. lock.release()
  13.  
  14. starttime = time.time()
  15. for i in range(0,50):
  16. t1 = threading.Thread(target=run,args=(i,))
  17. t1.setDaemon(True)
  18. t1.start()
  19. list.append(t1)
  20.  
  21. for i in list:
  22. i.join()
  23.  
  24. print(res)

6、当有多重锁时候,可以使用Rlock,使用递归锁可以避免出现死锁的情况

7、信号量简单实用。信号量就相当于多把锁

  1. # Author : xiajinqi
  2. import threading
  3. import time
  4.  
  5. semaphore = threading.BoundedSemaphore()
  6.  
  7. def run(i):
  8. semaphore.acquire()
  9. print("阮娇。。。。")
  10. time.sleep()
  11. semaphore.release()
  12.  
  13. for i in range(,):
  14. tt = threading.Thread(target=run,args=(i,))
  15. tt.start()

8、event 在线程间简单应用,车子等红灯

  1. # Author : xiajinqi
  2. import threading
  3. import time
  4.  
  5. event = threading.Event()
  6.  
  7. # - 绿灯 -20红灯,大于二十从0开始
  8. def lighter():
  9. count =
  10. while True :
  11.  
  12. if count >= and count < :
  13. event.clear()
  14. print("当前红灯")
  15. count = count +
  16. elif count >= :
  17. count =
  18. else :
  19. event.set()
  20. print("当前绿灯")
  21. count +=
  22. time.sleep()
  23. def run():
  24. while True :
  25. time.sleep()
  26. if event.is_set() : #event.waite( 如果没有值,就会一直卡主等待
  27. print("开始过十字路口")
  28. else :
  29. print("开始等车")
  30. event.wait()
  31.  
  32. t1 = threading.Thread(target=lighter)
  33. t2 = threading.Thread(target=run)
  34.  
  35. t1.start()
  36. t2.start()

9、队列queue和列表、元组的区别。二者都有顺序。但是从列表取一个数据,数据还存在。而队列取出一个数据以后,改数据在队列就会被清空。符合实际应用场景。队列有三种:一、先进先去 二、先进后去 三、可以设置优先级别的队

  1. import queue
  2.  
  3. # 先进先去
  4. qu= queue.Queue()
  5. for i in range(1,5):
  6. qu.put(i)
  7.  
  8. while qu.qsize() >0:
  9. print(qu.get())
  10.  
  11. # 先进后去
  12. import queue
  13.  
  14. # 先进先去
  15. qu= queue.LifoQueue()
  16. for i in range(1,5):
  17. qu.put(i)
  18.  
  19. while qu.qsize() >0:
  20. print(qu.get())
  21.  
  22. E:\Users\xiajinqi\PycharmProjects\Atm\venv\Scripts\python.exe E:/Users/xiajinqi/PycharmProjects/Atm/333.py
  23. 4
  24. 3
  25. 2
  26. 1
  27.  
  28. import queue
  29.  
  30. # 具有优先级别的队列 .类型需要一样
  31. qq= queue.PriorityQueue()
  32.  
  33. list =[(1,"xiajinqi"),(1,"test"),(2,"test2"),(3,"test3"),(5,"test5"),(3,"test3")]
  34.  
  35. for lt in list:
  36. qq.put(lt)
  37.  
  38. while qq.qsize() >0:
  39. print(qq.get())
  40.  
  41. import queue
  42.  
  43. # 具有优先级别的队列 .类型需要一样
  44. qq= queue.PriorityQueue()
  45.  
  46. list =[(1,"xiajinqi"),(1,"test"),(2,"test2"),(3,"test3"),(5,"test5"),(3,"test3")]
  47.  
  48. for lt in list:
  49. qq.put(lt)
  50.  
  51. while qq.qsize() >0:
  52. print(qq.get())

  

10、消费者生产者模型,解耦,相互不影响

  1. import queue
  2. import time
  3. import threading
  4. qu = queue.Queue(maxsize=)
  5.  
  6. # 每次生产十个
  7. def Producder():
  8. while True:
  9. for i in range(,):
  10. print("生产了两个骨头")
  11. qu.put("骨头 %s"%(i))
  12. time.sleep()
  13.  
  14. # 生产者消费者模型,多个人生产多个人消费。
  15. def Consumer(name) :
  16. while True:
  17. print("%s 吃了一个骨头 %s"%(name,qu.get()))
  18. time.sleep(0.5)
  19.  
  20. #两个消费
  21. c1 = threading.Thread(target=Consumer,args=("test1",))
  22. c2 = threading.Thread(target=Consumer,args=("test2",))
  23. pd1 = threading.Thread(target=Producder)
  24. pd1.start()
  25. c1.start()
  26. c2.start()

多线程深入理解和守护线程、子线程、锁、queue、evenet等介绍的更多相关文章

  1. [Java][Android] 多线程同步-主线程等待全部子线程完毕案例

    有时候我们会遇到这种问题:做一个大的事情能够被分解为做一系列相似的小的事情,而小的事情无非就是參数上有可能不同样而已! 此时,假设不使用线程,我们势必会浪费许多的时间来完毕整个大的事情.而使用线程的话 ...

  2. Unity3d 创建线程 子线程与主线程通信

    创建子线程 一,不带参数 Thread   resourcesLoadThread=new Thread (this.resourceLoadTxt); resourcesLoadThread.Sta ...

  3. NSThread 子线程 Cocoa NSOperation GCD(Grand Central Dispatch) 多线程

    单词:thread 英 θred:n 线.思路.vt 穿过.vi 穿透过 一.    进程.线程 进程:正在进行中的程序被称为进程,负责程序运行的内存分配,每一个进程都有自己独立的虚拟内存空间 线程: ...

  4. Tasks遇到的一些坑,关于在子线程中对线程权限认证。

    一般情况下,不应该在执行多线程认证的时候对其子线程进行身份认证,如:A线程的子线程B和子线程C. 当使用 Parallel.ForEach方法时,只有自身线程能够拥有相对应的权限,其子线程权限则为NU ...

  5. Android——子线程操作主线程

    子线程不能直接操作主线程 UI线程 //水平进度条 public void jdt1_onclick(View view) { final ProgressDialog pd = new Progre ...

  6. C#子线程执行完后通知主线程

    其实这个比较简单,子线程怎么通知主线程,就是让子线程做完了自己的事儿就去干主线程的转回去干主线程的事儿. 那么怎么让子线程去做主线程的事儿呢,我们只需要把主线程的方法传递给子线程就行了,那么传递方法就 ...

  7. C#子线程执行完后通知主线程(转)

    其实这个比较简单,子线程怎么通知主线程,就是让子线程做完了自己的事儿就去干主线程的转回去干主线程的事儿.  那么怎么让子线程去做主线程的事儿呢,我们只需要把主线程的方法传递给子线程就行了,那么传递方法 ...

  8. 线程概念( 线程的特点,进程与线程的关系, 线程和python理论知识,线程的创建)

    参考博客: https://www.cnblogs.com/xiao987334176/p/9041318.html 线程概念的引入背景 进程 之前我们已经了解了操作系统中进程的概念,程序并不能单独运 ...

  9. python 全栈开发,Day41(线程概念,线程的特点,进程和线程的关系,线程和python 理论知识,线程的创建)

    昨日内容回顾 队列 队列 : 先进先出.数据进程安全 队列实现方式: 管道 + 锁 生产者消费者模型 : 解决数据供需不平衡 管道 双向通信 数据进程不安全 EOFError: 管道是由操作系统进行引 ...

随机推荐

  1. net 4.0+EF6+Sqlite 使用,安装,打包

    开发 1.因为EF不支持Codefirst,开始可以使用SQL来进行开发. 部署安装 2.然后可以找到SQL转Sqlite工具(http://www.cnblogs.com/walkingp/arch ...

  2. TMG阵列部署选择

    如果用户环境中有多个网络出口,用EMS配置TMG是最佳选择.在这种情况下,可以使用EMS管理的阵列配置企业级访问规则.由于一个单一的策略适用于整个企业的所有阵列,因此管理成本将大大降低.用于EMS的服 ...

  3. delete in javascript

    Key word delete. 1. Delete global object. x = 42; // creates the property x on the global object var ...

  4. 企业级Ngnix基于域名的配置_server

    普通的nginx配置 egrep -v "#|^$" /usr/local/nginx/conf/nginx.conf.default 更改nginx的配置文件-->注意空格 ...

  5. VS 2012 在 windows 8 中无法使用 Deubgger.Lunch() 对服务进行调试

    找到了外文资料:   Debugger.Launch() not displaying JIT debugger selection popup on Windows 8/8.1   If execu ...

  6. August 21st 2017 Week 34th Monday

    In fact, the happiest fairy tale is no more than the simple days we have together. 其实全世界最幸福的童话,也比不上我 ...

  7. es6面试题--Promise相关

    1. const promise = new Promise((resolve, reject) => { console.log(); resolve(); console.log(); }) ...

  8. vue2.* 双向数据绑定 Vue事件介绍 以及Vue中的ref获取dom节点 04

    <template> <div id="app"> <!-- 双向数据绑定(必须在表单里面使用) m:model v:view mvvm:model改 ...

  9. 學習Extjs比較好的資源

    http://www.qeefee.com  學習mvc extjs等比較好 还有就是extjs文档 要多看extjs文档中的方法源码 egg:图片 点击format.js看源码如何定义

  10. 学习T-io框架,从写一个Redis客户端开始

    前言   了解T-io框架有些日子了,并且还将它应用于实战,例如 tio-websocket-server,tio-http-server等.但是由于上述两个server已经封装好,直接应用就可以.所 ...