博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python 多线程小方法
阅读量:6933 次
发布时间:2019-06-27

本文共 5957 字,大约阅读时间需要 19 分钟。

import timefrom multiprocessing import Process, Lock, JoinableQueuefrom multiprocessing import Semaphore, Eventimport randomimport 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("结束")

 

转载于:https://www.cnblogs.com/tcpblog/p/9845718.html

你可能感兴趣的文章
UITabBarControler解决旋转问题
查看>>
button 默认类型是submit
查看>>
数据结构与算法(周鹏-未出版)-第六章 树-6.2 二叉树
查看>>
<转>大型分布式网站术语浅析
查看>>
Java多线程之并发协作生产者消费者设计模式
查看>>
[置顶] 如何把你的笔记本电脑变成一个Wi-Fi路由器在Windows 7 & 8?
查看>>
Linux 查看CPU信息、机器型号等硬件信息
查看>>
实时检验您的页面是否符合XHTML标准——使用Validator Module
查看>>
python List&Set&Dict交集、并集、差集
查看>>
alienware Win8 系统安装
查看>>
一起谈.NET技术,不要在using语句中调用WCF服务
查看>>
四大最被高估的安全技术 用户感觉良好其实不然
查看>>
分析称iPhone漏洞或致手机受钓鱼攻击
查看>>
浅析Google Chrome 2.0浏览器安全性能
查看>>
WPF中使用amCharts绘制“.NET技术”股票K线图
查看>>
不开辟用于交换数据的临时空间,如何完成字符串的逆序
查看>>
分析网站配色的Firefox插件[前端工具]
查看>>
版本控制-git
查看>>
一个最新发现,原来程序员的最终归宿在这里。
查看>>
Tessnet2图片识别(2)
查看>>