会员可以在此提问,百战程序员老师有问必答
对大家有帮助的问答会被标记为“推荐”
看完课程过来浏览一下别人提的问题,会帮你学得更全面
截止目前,同学们一共提了 132358个问题
Python 全系列/第三阶段:Python 网络与并发编程/并发编程 902楼
Python 全系列/第三阶段:Python 网络与并发编程/并发编程 903楼
Python 全系列/第三阶段:Python 网络与并发编程/并发编程 904楼

from threading import Thread,Event
from time import sleep
'''
几分钟一辆车
人上车和车辆可以上人是要同时进行的,车辆不在站内和人等待车也是同时进行的
'''

def car():
    num=0
    #global count,有event就不用count了
    while True:
        if event.is_set():      #count%5!=0:
            print('车已到站,可以上车')
            sleep(1)
            #count+=1   #就是上了四个人后开走了
            num+=1
            if num%5==0:
                event.clear()       #上了五个人开走了
        else:
            print("车开走了....")
            sleep(6)
            #count=1        
            #过了六秒后又开来了
            event.set()     #重新变成真的
def person():
    while True:
        #if count%5!=0:
        if event.is_set():
            print('上车!!')
            sleep(1)
        else:
            print('等待车!!!') #用count的时候,等待一直在刷,程序没有停下来
            event.wait()        #阻塞线程
            #sleep(1)
if __name__=="__main__":
    event=Event()
    count=1
    t1=Thread(target=car)
    t2=Thread(target=person)
    t1.start()
    t2.start()

老师,这个event是在车方法里面变成True的,怎么在人方法里面也是True了,两个方法不是一个栈帧里面的,他们的调用event方法也能共用?

Python 全系列/第三阶段:Python 网络与并发编程/并发编程 905楼
Python 全系列/第三阶段:Python 网络与并发编程/网络通信 910楼

from multiprocessing import Process, Semaphore, Lock, Queue
import time

empty = Semaphore(2)
full = Semaphore(0)
lock = Lock()


class Consumer(Process):
    def __init__(self, buffer):
        Process.__init__(self)
        self.buffer = buffer

    def run(self):
        while True:
            full.acquire()
            lock.acquire()
            info = self.buffer.get()
            print('Consumer pop an element',info)
            time.sleep(1)
            lock.release()
            empty.release()


class Producer(Process):
    def __init__(self, buffer):
        Process.__init__(self)
        self.buffer = buffer

    def run(self):
        while True:
            empty.acquire()
            lock.acquire()
            self.buffer.put('bmt')
            print('Producer append an element')
            time.sleep(1)
            lock.release()

            full.release()


if __name__ == '__main__':
    buffer = Queue(10)
    p = Producer(buffer)
    c = Consumer(buffer)
    p.daemon = True
    c.daemon = True
    p.start()
    c.start()
    p.join() 
    c.join()
   

    print('Ended!')

老师,这个代码只输出两个

Producer append an element

Producer append an element

就卡住不执行了,老师帮我分析下,谢谢!

Python 全系列/第三阶段:Python 网络与并发编程/并发编程 912楼
Python 全系列/第三阶段:Python 网络与并发编程/网络通信 914楼

1554123195(1).jpg

是因为执行太快,导致两个线程的数据混乱了么~~

Python 全系列/第三阶段:Python 网络与并发编程/并发编程 915楼

课程分类

百战程序员微信公众号

百战程序员微信小程序

©2014-2025百战汇智(北京)科技有限公司 All Rights Reserved 北京亦庄经济开发区科创十四街 赛蒂国际工业园
网站维护:百战汇智(北京)科技有限公司
京公网安备 11011402011233号    京ICP备18060230号-3    营业执照    经营许可证:京B2-20212637