1. import time
  2. from multiprocessing import Process, Lock, JoinableQueue
  3. from multiprocessing import Semaphore, Event
  4. import random
  5. import json
  6.  
  7. # def get_tic(man, lock):
  8. # time.sleep(random.random())
  9. # lock.acquire()
  10. # with open("ticket", mode="r", encoding="utf-8") as f:
  11. # tic_info = json.load(f)
  12. # if tic_info["count"] > 0:
  13. # print("邮票", man)
  14. # with open("ticket", mode="w", encoding="utf--8") as f:
  15. # tic_info["count"] = 0
  16. # json.dump(tic_info, f)
  17. # print("已购买!")
  18. # else:
  19. # print("票呢")
  20. # lock.release()
  21. #
  22. #
  23. # if __name__ == '__main__':
  24. # l = Lock
  25. # for i in range(10):
  26. # p = Process(target=get_tic, args=(i, l()))
  27. # p.start()
  28.  
  29. # def wash(i, s):
  30. # s.acquire()
  31. # print("i %s 烧饼来洗脚,papapa" % i)
  32. # time.sleep(random.randrange(3, 5))
  33. # print("i%s,shao饼出来了" % i)
  34. # s.release()
  35. #
  36. # if __name__ == '__main__':
  37. # s = Semaphore(5)
  38. # for i in range(20):
  39. # p = Process(target=wash, args=(i, s))
  40. # p.start()
  41.  
  42. #
  43. # def traffic_lights(e):
  44. # while 1:
  45. # print("红灯停停停!")
  46. # time.sleep(5)
  47. # e.set()
  48. # print("绿灯行,走走走走!")
  49. # time.sleep(3)
  50. # e.clear()
  51. #
  52. #
  53. # def car(i, e):
  54. # if not e.is_set():
  55. # print(i, "等待")
  56. # e.wait()
  57. # print("走咯")
  58. # else:
  59. # print("出门一路绿灯!")
  60. #
  61. #
  62. # if __name__ == '__main__':
  63. # e = Event()
  64. # tl = Process(target=traffic_lights, args=(e, ))
  65. # tl.start()
  66. # while 1:
  67. # time.sleep(3)
  68. # for i in range(5):
  69. # c = Process(target=car, args=(i, e))
  70. # c.start()
  71.  
  72. from multiprocessing import Queue
  73.  
  74. # q = Queue(5)
  75. # q.put(0)
  76. # q.put(1)
  77. # q.put(2)
  78. # q.put(3)
  79. # q.put(4)
  80. # try:
  81. # # q.put_nowait()
  82. # q.
  83. # q.put(5)
  84. #
  85. # except:
  86. # print("满了")
  87. # print(q.get())
  88. # print(q.get())
  89. # print(q.get())
  90. # print(q.get())
  91. # print(q.get())
  92. # try:
  93. # q.put_nowait()
  94. # print(q.get())
  95. # except:
  96. # print("None")
  97.  
  98. #
  99. # def he(q):
  100. # print(q.get().decode("utf-8"))
  101. # print(q.get())
  102. #
  103. #
  104. # def her(q):
  105. # q.put("约?".encode("utf-8"))
  106. # print(q.get())
  107. #
  108. #
  109. # if __name__ == '__main__':
  110. # q = Queue(5)
  111. # h = Process(target=he, args=(q,))
  112. # she = Process(target=her, args=(q,))
  113. # h.start()
  114. # she.start()
  115. # time.sleep(1)
  116. # q.put("好好工作")
  117.  
  118. #
  119. # def producer(q):
  120. # for i in range(10):
  121. # time.sleep(1)
  122. # baozi = "包子 %s 号" % i
  123. # print(baozi)
  124. # q.put(baozi)
  125. # print("今天的任务完成了!")
  126. # # q.put(None)
  127.  
  128. # def have(q):
  129. # while 1:
  130. # take = q.get()
  131. # if take:
  132. # print("吃 %s" % take)
  133. # time.sleep(0.5)
  134. # else:
  135. # print("没得吃了!")
  136. # break
  137. #
  138. #
  139. # if __name__ == '__main__':
  140. # q = Queue(11)
  141. # p = Process(target=producer, args=(q,))
  142. # h = Process(target=have, args=(q,))
  143. # p.start()
  144. # h.start()
  145. # p.join()
  146. # q.put(None)
  147.  
  148. #
  149. # 明天默写内容:
  150. # 1 同步锁的作用
  151. # 答: 多个进程某一段相同内容的代码, 只允许最先到达的进程处理,释放之后才允许其他进程继续执行,
  152. # 优点1: 保护数据安全, 避免不可预见的意外,
  153. # 优点2: 异步进程在进行其他代码时不必等待, 只在这一段等待, 效率同比当前进程结束在运行其他进程效率要高
  154.  
  155. # 2 事件中有哪些方法
  156. # 1. wait() ,阻塞标记,
  157. # 2. set(), 阻塞标记处不等待效果设置为True, 在不再等待
  158. # 3. is_set(),判断阻塞标记wait()的真伪
  159. # 4, clear(), 还原wait标记 为False状态, 阻塞恢复等待
  160.  
  161. # 3 队列有哪些方法 注意 # 队列的查询结果会有延迟, 放和取数据需要时间, 查询qsize, empty,full都会有误差
  162. # get()获取队列中的内容
  163. # put()向队列中存数据
  164. # empty() 判断队列是否为空
  165. # full() 判断队列是否满载
  166. # put_nowait() 放入数据是不等待, 满载即刻报错
  167. # get_nowait() 获取数据时不等待, 空载即刻报错
  168. # a = Queue()
  169. # # a.get(False) # 取消阻塞状态, 效果与get_nowait相同
  170. # a.put(2, False) #取消阻塞状态, 效果与put_nowait相同
  171. # # print(a.get())
  172. # # qsize() 获取队列数据单元的数量
  173. # a.put(5)
  174. # print(a.qsize())
  175. # a.close() #关闭队列,不允许放, 也不能拿数据
  176. # print(a.get())
  177. # 4 简述生产者消费者模型
  178. # 生活中,生产者产生商品, 消费者消费商品, 但是消费者和生产者不直接进行交流, 而是交给中间平台 ,
  179. # 中间平台作为第三方沟通生产者和消费者, 双方之间无需等待, 互不干涉, 解决双方之间的不同步问题(i/o能力不同)
  180. #
  181. # 作业:
  182. # 1 基于队列写一个有多个消费者和生产者的模型
  183. # JoinableQueue # 一个具有空载发出信号的队列
  184. # 1 ,可以不断往里面存放 数据, join()等待队列的数据拿完,执行往下代码
  185. # 2, 取数据的时候用task_done()告诉队列去了数据
  186.  
  187. #
  188. # class Person(Process):
  189. # def __init__(self, q):
  190. # super().__init__()
  191. # self.q = q
  192. #
  193. # def run(self):
  194. # while 1:
  195. # time.sleep(0.1)
  196. # product = self.q.get()
  197. # print(self.name, "买下了", product)
  198. # self.q.task_done()
  199. #
  200. #
  201. # class Producer(Process):
  202. # def __init__(self, pai, q):
  203. # super().__init__()
  204. # self.pai = pai
  205. # self.q = q
  206. #
  207. # def run(self):
  208. # for i in range(20):
  209. # self.q.put("product %s " % i)
  210. # print("%s 生产了商品%s" % (self.pai, i))
  211. # time.sleep(0.5)
  212. # print("I'm back home")
  213. # self.q.join()
  214. # print("卖完了!")
  215. #
  216. #
  217. # if __name__ == '__main__':
  218. # q = JoinableQueue(20)
  219. # pro = Producer("dell", q)
  220. # pro.start()
  221. # man = Person(q)
  222. # man.daemon = True # man跟随主进程结束
  223. # man.start()
  224. # pro.join() # 等待pro进程结束接续下面的代码
  225. # # time.sleep(5)
  226. # print("main process is end !")
  227. # 2再有时间的话:
  228. # 使用同步锁写一个简单的抢票程序,提供并发查票和并发买票的功能
  229.  
  230. def buy(i, q):
  231. with open("ticket", mode="r", encoding="utf-8") as f:
  232. info = json.load(f)
  233. print(info["count"], i) # 进入查询
  234. time.sleep(random.random()) # 模拟网络延迟
  235. with open("ticket", mode="r", encoding="utf-8") as f: # 模拟付款
  236. info2 = json.load(f)
  237. q.acquire() # 锁定下段代码
  238. if info2["count"] > 0:
  239. print("%s 余票 %s 张" % (i, info["count"]))
  240. print("我的了%s" % i)
  241. info2["count"] = 0
  242. info2["me"] = 1
  243. info2["owner"] = i
  244. with open("ticket", mode="w", encoding="utf-8") as f1:
  245. json.dump(info2, f1)
  246. q.release()
  247. with open("ticket%s" % i, mode="w", encoding="utf-8") as f:
  248. json.dump(info2, f) # 模拟购买情况
  249. # time.sleep(5)
  250. # with open()
  251.  
  252. if __name__ == '__main__':
  253. q = Lock()
  254. lst = []
  255. for i in range(20):
  256. b = Process(target=buy, args=(i, q))
  257. lst.append(b)
  258. b.start()
  259. for p in lst:
  260. p.join()
  261.  
  262. print("结束")

python 多线程小方法的更多相关文章

  1. python 多线程小练习

    需求:有100个数据,启动5个线程,每个线程分20个数据,怎么把这20个数据分别传给每个线程. 1. 利用多线程实现 import threading nums = list(range(100)) ...

  2. Python多线程及其使用方法

    [Python之旅]第六篇(三):Python多线程及其使用方法   python 多线程 多线程使用方法 GIL 摘要: 1.Python中的多线程     执行一个程序,即在操作系统中开启了一个进 ...

  3. python多线程几种方法实现

    python多线程编程 Python多线程编程中常用方法: 1.join()方法:如果一个线程或者在函数执行的过程中调用另一个线程,并且希望待其完成操作后才能执行,那么在调用线程的时就可以使用被调线程 ...

  4. python - 常用的小方法

    常用的小方法: bin() oct() hex() chr() ord() dir() id() len() int() str() type() help() range(10)   /  rang ...

  5. Python 多线程教程:并发与并行

    转载于: https://my.oschina.net/leejun2005/blog/398826 在批评Python的讨论中,常常说起Python多线程是多么的难用.还有人对 global int ...

  6. 【跟我一起学Python吧】Python 多线程

    其实自我感觉Python的多线程很类似于Java的多线程机制,但是比JAVA的多线程更灵活.在早期的Python多线程实现中,采用了thread模块.例如: from time import ctim ...

  7. 搞定python多线程和多进程

    1 概念梳理: 1.1 线程 1.1.1 什么是线程 线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发 ...

  8. 进程,线程,GIL,Python多线程,生产者消费者模型都是什么鬼

    1. 操作系统基本知识,进程,线程 CPU是计算机的核心,承担了所有的计算任务: 操作系统是计算机的管理者,它负责任务的调度.资源的分配和管理,统领整个计算机硬件:那么操作系统是如何进行任务调度的呢? ...

  9. python多线程、多进程以及GIL

    多线程 使用threading模块创建线程 传入一个函数 这种方式是最基本的,即调用threading中的Thread类的构造函数,然后指定参数target=func,再使用返回的Thread的实例调 ...

随机推荐

  1. Going Home POJ - 2195 (最小费用最大流)

    On a grid map there are n little men and n houses. In each unit time, every little man can move one ...

  2. linux简单优化

    1.简单优化 #关闭firewalld,selinux,NetworkManager systemctl(管理服务的命令) stop(关服务) firewalld (服务名称,d是demo的意思) s ...

  3. MySQL利用binlog恢复误操作数据(python脚本)

    在人工手动进行一些数据库写操作的时候(比方说数据订正),尤其是一些不可控的批量更新或删除,通常都建议备份后操作.不过不怕万一,就怕一万,有备无患总是好的.在线上或者测试环境误操作导致数据被删除或者更新 ...

  4. BZOJ2815 拓扑排序 + LCA

    https://www.lydsy.com/JudgeOnline/problem.php?id=2815 作为一个DAG图,结点之间又有这么明显的等级之分,很容易想到的是拓扑排序. 但是不管是正向的 ...

  5. java 中+的运算规则

    1.Java中的加法的运算优先级是从左往右的 2.字符串""隔壁跟的+号意思是字符串的连接 就不是加法了 3.'字符' 后面的+号意思是'字符'的ascall码值和后面的值相加 c ...

  6. hadoop 开发环境搭建

    一,安装java环境 添加java环境变量 vi /etc/profile   # add by tank export JAVA_HOME=/data/soft/jdk/jdk1.7.0_71 ex ...

  7. Kafka技术内幕 读书笔记之(一) Kafka入门

    在0.10版本之前, Kafka仅仅作为一个消息系统,主要用来解决应用解耦. 异步消息 . 流量削峰等问题. 在0.10版本之后, Kafka提供了连接器与流处理的能力,它也从分布式的消息系统逐渐成为 ...

  8. 5句话搞定ES5作用域

    JavaScript的作用域一直以来是前端开发中比较难以理解的知识点,对于JavaScript的作用域主要记住几句话,走遍天下都不怕... 一.“JavaScript中无块级作用域” 在Java或C# ...

  9. Structured Streaming + Kafka Integration Guide 结构化流+Kafka集成指南 (Kafka broker version 0.10.0 or higher)

    用于Kafka 0.10的结构化流集成从Kafka读取数据并将数据写入到Kafka. 1. Linking 对于使用SBT/Maven项目定义的Scala/Java应用程序,用以下工件artifact ...

  10. 解析/proc/net/dev

    https://stackoverflow.com/questions/1052589/how-can-i-parse-the-output-of-proc-net-dev-into-keyvalue ...