• 进程同步锁 队列


    -------------------------------------------------------------------突破自己很难,但是不要放弃,相信时间的力量,一起都是最好的安排!

    # # ------------------------------------------------------------------------------------------------------------#

    守护进程:主进程的代码运行结束,守护进程跟着结束

    进程同步:

    同步锁(互斥锁)  ***** 重点

    保证数据安全用的,但是将锁起来的那段代码的执行变成了同步串行,牺牲了效率,保证了安全

    L = Lock()

    L.acquire()

    数据操作

    L.release()

    信号量  

    Semaphore 内部维护了一个计数器,acquire - 1,release + 1,当计数器为0的时候,阻塞其他进程

    事件  

    e = Event, 事件初识状态为False,当事件为Flase,e.wait()的地方会阻塞,e.set()e的状态改为True,如果e的状态为True,wait的地方就不等待了,不阻塞了,e.clear()e的状态改为False,  查看e的状态:is_set,

    进程通信(IPC)

    队列  ***** 重点

    队列:进程安全的,能够保证数据安全,

    Q = queue(4) ,给队列设定一个固定的长度,q.put(),q.get(),q.get_nowait(),q.get(False),

    Q.put()在队列满了的时候会阻塞和q.get在队列空了之后会阻塞

    Q.put_nowait()

    Q.full q.empty

    生产者消费者模型

    缓冲区解耦的事情

    Joinablequeue,能记录着你往队列里面put的数据量

    其他方法和queue是一样的,queue多了两个方法:q.task_done,q.join

    明日预习: https://www.cnblogs.com/clschao/articles/9629392.html

    管道

    数据共享

    进程池

    今日作业:

    1.多进程:写两个纯计算的任务,开两个子进程来执行,统计一下这两个任务的执行时间,再统计一下两个任务串行执行的时间

    2.基于队列写一个多个生产者和多个消费者的模型

    3.基于锁的抢票代码,能够并发查询票数和并发抢票操作.

    # --------------[进程同步锁]--------------

    from multiprocessing import Process, Lock
    import os, time


    def work(n, lock):
    # 加锁 保证每次只有一个进程执行锁里面的程序,这一段程序对于所有写上这个锁的进程,大家都变成了串行
    lock.acquire()
    print('%s: %s is Run' % (n, os.getpid()))
    time.sleep(1)
    print('%s: %s is Done' % (n, os.getpid()))
    # 解锁,解锁之后其他进程才能去执行自己的程序
    lock.release()


    if __name__ == '__main__':
    lock = Lock()
    for i in range(5):
    p = Process(target=work, args=(i, lock))
    p.start()

    --------------[进程同步锁++模拟抢票]--------------

    from multiprocessing import Process, Lock
    import time, json


    def search():
    dic = json.load(open('Qi.txt')) # 打开文件 直接获取文件中的内容,按到文件中包含的剩余票数的字典
    print('剩余票数:%s' % dic['count'])


    # 抢票
    def get():
    dic = json.load(open('Qi.txt'))
    time.sleep(1) # 模拟网络延迟 进程之间的 切换导致所有人拿到的字典都是{'count:1'},也就是每个人都拿到了这一票
    if dic['count'] > 0:
    dic["count"] -= 1
    time.sleep(0.2)
    json.dump(dic, open('Qi.txt', 'w'))
    print('抢票成功')

    def task():
    search()
    get()

    if __name__ == '__main__':
    for i in range(3):
    p=Process(target=task)
    p.start()

    --------------[进程同步锁++模拟抢票+上锁操作]--------------
    from multiprocessing import Process,Lock
    import time,json,random


    def search():
    dic = json.load(open('Qi.txt')) # 打开文件 直接获取文件中的内容,按到文件中包含的剩余票数的字典
    print('剩余票数:%s' % dic['count'])


    # 抢票
    def get():
    dic=json.load(open('Qi.txt'))
    time.sleep(0.1) #模拟读数据的网络延迟,那么进程之间的切换,导致所有人拿到的字典都是{"count": 1},也就是每个人都拿到了这一票。
    if dic['count'] >0:
    dic['count']-=1
    time.sleep(0.2) #模拟写数据的网络延迟
    json.dump(dic,open('Qi.txt','w'))
    #最终结果导致,每个人显示都抢到了票,这就出现了问题~
    print('购票成功!')
    else:
    print('sorry,没票了!')


    def task(lock):
    search()
    #因为抢票的时候是发生数据变化的时候,所有我们将锁加加到这里
    lock.acquire()
    get()
    lock.release()

    if __name__ == '__main__':
    lock = Lock() #创建一个锁
    for i in range(3): #模拟并发100个客户端抢票
    p=Process(target=task,args=(lock,)) #将锁作为参数传给task函数
    p.start()

    # --------------[事件]--------------

    from multiprocessing import Process,Event

    e = Event() # Event 开启事件,有两个状态 一个是Ture 一个是False 默认是False

    print('开始')

    print('>>>',e.is_set()) #查看事件的状态

    e.set() #将时间对象的状态改为True

    print('>>>',e.is_set())

    e.clear() #将时间事件状态改为False

    e.wait() # 等待,当状态事件为True时 执行后面的程序 如果为False则继续等待

    print('结束')

    # --------------[队列]--------------
    from multiprocessing import Queue

    q = Queue(3)

    q.put("s")
    q.put("b")

    print(q.full()) #q.full() 对垒满了返回True 不满 返回False
    #---> False
    q.put("d")

    print(q.full()) #q.full() 对垒满了返回True 不满 返回False
    #---> True

    print(q.get())


    print(q.get())
    print(q.get())

    q.get_nowait()

    # --------------[基于队列的进程间的通讯]--------------

    from multiprocessing import Queue
    from multiprocessing import Process



    def fun(m):

    res = q.get()
    print(res)


    if __name__ == '__main__':
    q =Queue(5)
    q.put('helloword!')
    p = Process(target=fun,args=(m,))
    p.start()
    print('主进程结束')


    # --------------*******--------------
  • 相关阅读:
    mongoDB 常用函数
    无缓冲通道 vs 有缓冲通道
    go实现终端输出颜色文本
    JavaScript获取当前时间
    201521123082《Java程序设计》第2周学习总结
    201521123082 《Java程序设计》第1周学习总结
    201521123074 《Java程序设计》第2周学习总结
    第2周作业-Java基本语法与类库
    201521123094 《Java程序设计》第1周学习总结
    201521123047 《Java程序设计》第4周学习总结
  • 原文地址:https://www.cnblogs.com/dealdwong2018/p/10033277.html
Copyright © 2020-2023  润新知