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("结束")

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. IOS11 底部输入框被手机输入法遮住

    前言: 最近在做一个评论的功能,前端页面中输入评论框在页面的最底部,在ios11中手机的输入法会遮住那个输入框,在其它手机上正常. 一直在找有关的解决方案,虽然最终也没有解决,还是记录过程,供参考. ...

  2. (转)你应该知道的RPC原理

    背景:对于项目中的RPC框架,仅仅停留在使用层面,对于其底层的实现原理不是很清楚.这样的后果是很危险的,对于面试官来说,跟不知道这个东西一样. 转载自:https://www.cnblogs.com/ ...

  3. undefined is not an object(evaluating '_react3.default.PropTypes.shape)

    手机红屏报这个错时的解决办法: npm uninstall --save react-native-deprecated-custom-components npm install --save ht ...

  4. 关于用户输入恶意js

    有些黑客经常闲得蛋疼的那别人的网站测试,利用一些输入的漏洞提交js代码,搞恶作剧. 对于freemarker视图的web应用,可以参考以下方法: http://yshjava.iteye.com/bl ...

  5. CodeForces - 18A Triangle(数学?)

    传送门 题意: 给出三个点的坐标,初始,这三个点可以构成一个三角形. 如果初始坐标可以构成直角三角形,输出"RIGNT". 如果某个点的 x或y 坐标移动一个单位后可以组成直角三角 ...

  6. 应用实战:从Redis到Aerospike,我们踩了这些坑

    个推专注为开发者们提供消息推送服务多年.通过个推SDK,手机终端与服务器建立长连接,维持在线状态.然而在网络异常等情况下,消息无法实时送达到终端用户,因而推送服务器建立了一份离线消息列表,以待用户重新 ...

  7. 10款Mac上程序员装机必备的开发工具推荐和下载

    10款Mac上程序员装机必备的开发工具推荐和下载 使用Mac的用户主要有两大类:设计师和程序员,为各位程序员童鞋推荐10个Mac上非常棒的开发工具和辅助工具,分享软件专题[10款Mac上程序员装机必备 ...

  8. chrome截图全网页

    1.F12 2.ctrl+shift+p 3.输入:capture 4.选择Capture full size screenshot

  9. LightGBM 调参方法(具体操作)

     sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频) https://study.163.com/course/introduction.htm?courseId=1005269003& ...

  10. How-to: Do Statistical Analysis with Impala and R

    sklearn实战-乳腺癌细胞数据挖掘(博客主亲自录制视频教程) https://study.163.com/course/introduction.htm?courseId=1005269003&a ...