python 多线程小方法
import time from multiprocessing import Process, Lock, JoinableQueue from multiprocessing import Semaphore, Event import random import json # def get_tic(man, lock): # time.sleep(random.random()) # lock.acquire() # with open("ticket", mode="r", encoding="utf-8") as f: # tic_info = json.load(f) # if tic_info["count"] > 0: # print("邮票", man) # with open("ticket", mode="w", encoding="utf--8") as f: # tic_info["count"] = 0 # json.dump(tic_info, f) # print("已购买!") # else: # print("票呢") # lock.release() # # # if __name__ == '__main__': # l = Lock # for i in range(10): # p = Process(target=get_tic, args=(i, l())) # p.start() # def wash(i, s): # s.acquire() # print("i %s 烧饼来洗脚,papapa" % i) # time.sleep(random.randrange(3, 5)) # print("i%s,shao饼出来了" % i) # s.release() # # if __name__ == '__main__': # s = Semaphore(5) # for i in range(20): # p = Process(target=wash, args=(i, s)) # p.start() # # def traffic_lights(e): # while 1: # print("红灯停停停!") # time.sleep(5) # e.set() # print("绿灯行,走走走走!") # time.sleep(3) # e.clear() # # # def car(i, e): # if not e.is_set(): # print(i, "等待") # e.wait() # print("走咯") # else: # print("出门一路绿灯!") # # # if __name__ == '__main__': # e = Event() # tl = Process(target=traffic_lights, args=(e, )) # tl.start() # while 1: # time.sleep(3) # for i in range(5): # c = Process(target=car, args=(i, e)) # c.start() from multiprocessing import Queue # q = Queue(5) # q.put(0) # q.put(1) # q.put(2) # q.put(3) # q.put(4) # try: # # q.put_nowait() # q. # q.put(5) # # except: # print("满了") # print(q.get()) # print(q.get()) # print(q.get()) # print(q.get()) # print(q.get()) # try: # q.put_nowait() # print(q.get()) # except: # print("None") # # def he(q): # print(q.get().decode("utf-8")) # print(q.get()) # # # def her(q): # q.put("约?".encode("utf-8")) # print(q.get()) # # # if __name__ == '__main__': # q = Queue(5) # h = Process(target=he, args=(q,)) # she = Process(target=her, args=(q,)) # h.start() # she.start() # time.sleep(1) # q.put("好好工作") # # def producer(q): # for i in range(10): # time.sleep(1) # baozi = "包子 %s 号" % i # print(baozi) # q.put(baozi) # print("今天的任务完成了!") # # q.put(None) # def have(q): # while 1: # take = q.get() # if take: # print("吃 %s" % take) # time.sleep(0.5) # else: # print("没得吃了!") # break # # # if __name__ == '__main__': # q = Queue(11) # p = Process(target=producer, args=(q,)) # h = Process(target=have, args=(q,)) # p.start() # h.start() # p.join() # q.put(None) # # 明天默写内容: # 1 同步锁的作用 # 答: 多个进程某一段相同内容的代码, 只允许最先到达的进程处理,释放之后才允许其他进程继续执行, # 优点1: 保护数据安全, 避免不可预见的意外, # 优点2: 异步进程在进行其他代码时不必等待, 只在这一段等待, 效率同比当前进程结束在运行其他进程效率要高 # 2 事件中有哪些方法 # 1. wait() ,阻塞标记, # 2. set(), 阻塞标记处不等待效果设置为True, 在不再等待 # 3. is_set(),判断阻塞标记wait()的真伪 # 4, clear(), 还原wait标记 为False状态, 阻塞恢复等待 # 3 队列有哪些方法 注意 # 队列的查询结果会有延迟, 放和取数据需要时间, 查询qsize, empty,full都会有误差 # get()获取队列中的内容 # put()向队列中存数据 # empty() 判断队列是否为空 # full() 判断队列是否满载 # put_nowait() 放入数据是不等待, 满载即刻报错 # get_nowait() 获取数据时不等待, 空载即刻报错 # a = Queue() # # a.get(False) # 取消阻塞状态, 效果与get_nowait相同 # a.put(2, False) #取消阻塞状态, 效果与put_nowait相同 # # print(a.get()) # # qsize() 获取队列数据单元的数量 # a.put(5) # print(a.qsize()) # a.close() #关闭队列,不允许放, 也不能拿数据 # print(a.get()) # 4 简述生产者消费者模型 # 生活中,生产者产生商品, 消费者消费商品, 但是消费者和生产者不直接进行交流, 而是交给中间平台 , # 中间平台作为第三方沟通生产者和消费者, 双方之间无需等待, 互不干涉, 解决双方之间的不同步问题(i/o能力不同) # # 作业: # 1 基于队列写一个有多个消费者和生产者的模型 # JoinableQueue # 一个具有空载发出信号的队列 # 1 ,可以不断往里面存放 数据, join()等待队列的数据拿完,执行往下代码 # 2, 取数据的时候用task_done()告诉队列去了数据 # # class Person(Process): # def __init__(self, q): # super().__init__() # self.q = q # # def run(self): # while 1: # time.sleep(0.1) # product = self.q.get() # print(self.name, "买下了", product) # self.q.task_done() # # # class Producer(Process): # def __init__(self, pai, q): # super().__init__() # self.pai = pai # self.q = q # # def run(self): # for i in range(20): # self.q.put("product %s " % i) # print("%s 生产了商品%s" % (self.pai, i)) # time.sleep(0.5) # print("I'm back home") # self.q.join() # print("卖完了!") # # # if __name__ == '__main__': # q = JoinableQueue(20) # pro = Producer("dell", q) # pro.start() # man = Person(q) # man.daemon = True # man跟随主进程结束 # man.start() # pro.join() # 等待pro进程结束接续下面的代码 # # time.sleep(5) # print("main process is end !") # 2再有时间的话: # 使用同步锁写一个简单的抢票程序,提供并发查票和并发买票的功能 def buy(i, q): with open("ticket", mode="r", encoding="utf-8") as f: info = json.load(f) print(info["count"], i) # 进入查询 time.sleep(random.random()) # 模拟网络延迟 with open("ticket", mode="r", encoding="utf-8") as f: # 模拟付款 info2 = json.load(f) q.acquire() # 锁定下段代码 if info2["count"] > 0: print("%s 余票 %s 张" % (i, info["count"])) print("我的了%s" % i) info2["count"] = 0 info2["me"] = 1 info2["owner"] = i with open("ticket", mode="w", encoding="utf-8") as f1: json.dump(info2, f1) q.release() with open("ticket%s" % i, mode="w", encoding="utf-8") as f: json.dump(info2, f) # 模拟购买情况 # time.sleep(5) # with open() if __name__ == '__main__': q = Lock() lst = [] for i in range(20): b = Process(target=buy, args=(i, q)) lst.append(b) b.start() for p in lst: p.join() print("结束")