博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python中的进程(二)
阅读量:4691 次
发布时间:2019-06-09

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

一 : 概述

  当多个进程同时访问一个变量或者一个文件的时候,可能会发生数据紊乱的问题,为了解决这个问题,便有了锁这个工具.

二 : 锁的创建和使用

  使用到的锁也是在multiprocessing包中的Lock类,要使用锁将它实例化即可.

  锁可以使得一个变量或文件在同时只能有一个进程访问,相当于给变量(或文件)加了一把锁,当该进程使用完毕,将锁释放之后,其他进程才可以访问.

from multiprocessing import Process,Lockimport timedef check(i):    with open('余票') as f:        con = f.read()    print('第%s个人查到余票还剩%s张'%(i,con))def buy_ticket(i,l):    l.acquire()# 拿钥匙,锁门    with open('余票') as f:        con = int(f.read())        time.sleep(0.1)    if con > 0:        print('\033[31m 第%s个人买到票了\033[0m'%i)        con -= 1    else:        print('\033[32m 第%s个人没有买到票\033[0m'%i)    time.sleep(0.1)# 是指 买完票后,把余票数量重写写入数据库的时间延迟    with open('余票','w') as f:        f.write(str(con))    l.release()# 还钥匙,开门if __name__ == '__main__':    l = Lock()    for i in range(10):        p_ch = Process(target=check,args=(i+1,))        p_ch.start()    for i in range(10):        p_buy = Process(target=buy_ticket,args=(i+1,l))        p_buy.start()

  对象的acquire()方法可以加锁,release()可以释放锁,将需要加锁的代码块放在这两句中间即可.

三 : 信号量的创建和使用

  有时候,我们需要多个进程同时访问一个方法,但是又要对他们加以控制,换个说法,也就是需要一个有多把钥匙的锁,这时候我们需要信号量(Semaphore)

  使用方法和Lock一致,不同的是实例化的时候需要传入一个int类型的参数,也就是创建几把钥匙,加锁和释放的方法也和lock一致,非常简单.

from multiprocessing import Process,Semaphoreimport timedef func(i,sem):    sem.acquire()    print('第%s个人进入小黑屋,拿了钥匙锁上门' % i)    time.sleep(1)    print('第%s个人出去小黑屋,还了钥匙打开门' % i)    sem.release()if __name__ == '__main__':    sem = Semaphore(5)# 初始化了一把锁5把钥匙,也就是说允许5个人同时进入小黑屋    # 之后其他人必须等待,等有人从小黑屋出来,还了钥匙,才能允许后边的人进入    for i in range(20):        p = Process(target=func,args=(i,sem,))        p.start()

四 : 事件的创建和使用

  为了使用主进程控制子进程,创建了事件机制.要使用事件,需要导入multiprocessing包中的Event,通过几个方法控制来事件.

  事件处理的机制:全局定义一个flag(event.is_set()),如果为False,那么程序执行event.wait()的时候就会阻塞,为True,则不阻塞.

  事件的方法:

    set() : 将flag设为True

    clear() : 将flag设为False

    is_set() : 返回flag的值

  下面用一个红绿灯函数来演示事件的使用

def tra(e):    '''信号灯函数'''    while 1:# 红绿灯得一直亮着,要么是红灯要么是绿灯        if e.is_set():# True,代表绿灯亮,那么此时代表可以过车            time.sleep(5)# 所以在这让灯等5秒钟,这段时间让车过            print('\033[31m 红灯亮! \033[0m')# 绿灯亮了5秒后应该提示到红灯亮            e.clear()# 把is_set设置为False        else:            time.sleep(5)# 此时代表红灯亮了,此时应该红灯亮5秒,在此等5秒            print('\033[32m 绿灯亮! \033[0m')# 红的亮够5秒后,该绿灯亮了            e.set()# 将is_set设置为Truedef Car(i,e):    e.wait()# 车等在红绿灯,此时要看是红灯还是绿灯,如果is_set为True就是绿灯,此时可以过车    print('第%s辆车过去了'%i)if __name__ == '__main__':    e = Event()    triff_light = Process(target=tra,args=(e,))# 信号灯的进程    triff_light.start()    for i in range(50):# 描述50辆车的进程        if i % 3 == 0:            time.sleep(2)        car = Process(target=Car,args=(i+1,e,))        car.start()

 

转载于:https://www.cnblogs.com/DoingBe/p/9519203.html

你可能感兴趣的文章
PAT甲级题解-1123. Is It a Complete AVL Tree (30)-AVL树+满二叉树
查看>>
项目开发总结报告(GB8567——88)
查看>>
SSH加固
查看>>
端口扫描base
查看>>
iOS IM开发的一些开源、框架和教程等资料
查看>>
FansUnion:共同写博客计划终究还是“流产”了
查看>>
python 二维字典
查看>>
pip 警告!The default format will switch to columns in the future
查看>>
Arrays类学习笔记
查看>>
实验吧之【天下武功唯快不破】
查看>>
2019-3-25多线程的同步与互斥(互斥锁、条件变量、读写锁、自旋锁、信号量)...
查看>>
win7-64 mysql的安装
查看>>
dcm4chee 修改默认(0002,0013) ImplementationVersionName
查看>>
maven3在eclipse3.4.2中创建java web项目
查看>>
发布时间 sql语句
查看>>
黑马程序员 ExecuteReader执行查询
查看>>
记一些从数学和程序设计中体会到的思想
查看>>
题目1462:两船载物问题
查看>>
POJ 2378 Tree Cutting(树形DP,水)
查看>>
第二冲刺阶段个人博客5
查看>>