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. A1131. Subway Map (30)

    In the big cities, the subway systems always look so complex to the visitors. To give you some sense ...

  2. (转)轻松学,Java 中的代理模式及动态代理

    背景:讲到反射机制,肯定会想到动态代理. 轻松学,Java 中的代理模式及动态代理 代理模式可以在不修改被代理对象的基础上,通过扩展代理类,进行一些功能的附加与增强.值得注意的是,代理类和被代理类应该 ...

  3. Django(四)框架之第三篇模板语法

    https://www.cnblogs.com/yuanchenqi/articles/6083427.htm https://www.cnblogs.com/haiyan123/p/7725568. ...

  4. Django(三)框架之第二篇

    https://www.cnblogs.com/haiyan123/p/7717788.html 一.知识点回顾 1.MTV模型 model:模型,和数据库相关的 template:模板,存放html ...

  5. ElasticSearch6.5.0【Java客户端之TransportClient】

    说明 TransportClient:网上流传最多的客户端,目前最新版本 Java REST Client:官方推荐的客户端, 官方:我们要在Elasticsearch 7.0的版本中不赞成使用Tra ...

  6. id选择器为变量时

    使用angularjs或者freemarker的同学基本都接触过一个问题:当使用list遍历数组值显示在页面,并要对所显示的数值进行操作时,如何选取数值所在标签? 以下是一个把地址id转为中文地址的函 ...

  7. JS学习笔记Day4

    一.什么是函数 将反复使用的功能代码,封装成一独立的模块,这个模块叫做函数 二.封装函数的好处 1.一次封装,多次使用 2.使程序可控 三.函数的分类:内置()函数和自定义函数 四.函数的数据类型(f ...

  8. (递推)codeVs1011 && 洛谷P1028 数的计算

    题目描述 Description 我们要求找出具有下列性质数的个数(包含输入的自然数n): 先输入一个自然数n(n<=1000),然后对此自然数按照如下方法进行处理: 1.          不 ...

  9. python对象继承

    继承允许我们在两个或者更多的类之间创建一种“是一个”的关系,这种关系把共同的细节抽象到一个超类里. 从技术上讲,每一个我们创建的类都使用了继承,所有的python类都是一个叫做object的特殊类的子 ...

  10. docker的使用 -- windows

    1. 下载docker desktop https://www.docker.com/products/docker-desktop 更多操作指令 ps: 值得注意的是,刚下载下来的docker只能在 ...