python的协程和多线程,python 线程 协程

  python的协程和多线程,python 线程 协程

  文章目录事件同步对象信号量信号量队列

  这篇文章是关于Python进程的,主要是事件同步对象,信号量和队列。

  事件对象1。概念:

  我们可以为线程设置一个等待值。在等待期间,其他线程不能继续执行,直到这个值被清除,其他线程才能继续执行。

  比如考试,监考老师进教室,一群学生开始考试;

  然后只有老师说停笔,你才能走出考场;

  即使你写完了论文,你也要等老师通知后才能离开。

  2.测试代码:

  导入线程,时间

  #教师类别

  班主任(穿线。线程):

  定义运行(自身):

  打印(老师:开始考试吧,今天12点半了!)

  Print(event.isSet()) #检查是否有设定值

  #开始设置值

  event.set()

  Time.sleep(5) #将标准测试时间设置为5秒

  #教师的行动

  打印(老师:12点半了,考试结束了!)

  #老师的动作结束了,再检查一下值是设置的还是假的。

  Print(event.isSet()) #再次检查该值是否已设置

  event.set()

  #学生班级

  班级学生(线程。线程):

  定义运行(自身):

  event.wait()

  打印(学生:唉,考试开始了……)

  Time.sleep(1) #假设学生考试只花1秒钟。

  Event.clear() # clear

  event.wait()

  打印(学生:终于考完了……)

  if __name__==__main__ :

  #实例化一个事件对象

  事件=线程。事件()

  L=[]

  对于范围(5)中的I:

  L.append(Student())

  L.append(Teacher())

  #开始线程

  对于L中的t:

  启动()

  对于L中的t:

  T.join()3。测试结果:

  你可以看到,几个学生同时在考试,这群学生只有在老师完成这个任务后才能结束。

  西蒙信号1。参考概念:

  信号量用于控制可以同时打开的线程数量。BoundedSemaphore或Semaphore管理一个内置计数器,每当调用acquire()时,该计数器为-1,当调用release()时,该计数器为1。

  计数器不能小于0。当计数器为0时,acquire()会将线程阻塞到同步锁定状态,直到其他线程调用release()。(类似于停车位的概念)

  BoundedSemaphore和Semaphore唯一的区别是,前者在调用release()时会检查计数器的值是否超过了计数器的初始值,如果超过了就会抛出异常。

  2.测试代码:

  导入线程,时间

  #继承线程的类

  类MyThread(线程。线程):

  定义运行(自身):

  if semaphore.acquire():

  Print(self.name) #输出线程名

  Time.sleep(5) #睡眠5秒,每个线程都会停留5秒

  #释放信号量

  信号量. release()

  if __name__==__main__ :

  # Set semaphore,5表示一次可以执行5个线程。

  信号量=线程。信号量(5)

  L=[]

  对于范围内的I(100):

  L.append(MyThread())

  对于L中的t:#启动线程

  T.start()3。测试结果:

  你可以看到,每五个线程出来。

  1.先进先出型:

  导入队列#导入线程队列

  L=[]

  #创建线程队列对象

  q=队列。队列(5)

  #可以容纳5个对象的队列(如果没有指定,可以是任意大小)。block=False表示队列已满,并将提示一条错误消息。

  #在线程队列中放一个值

  q.put([1,233333])

  q.put([2,小女孩])

  Q.put([3,{name :初音 }])

  #q.put({name2 :初音未来2})

  #重视价值

  虽然正确:

  data=q.get(block=True)

  #block=False表示如果卡住,会提示错误,

  #因为线程队列没有数据要取,所以会提示队列为空的消息。

  打印(数据,-)

  2.先进后出:

  导入队列

  #后进先出队列

  q=队列。LifoQueue()

  #在线程队列中放一个值

  q.put([1,233333])

  q.put([2,小女孩])

  Q.put([3,{name :初音 }])

  #重视价值

  虽然正确:

  data=q.get(block=False)

  #block=False表示如果卡住,会提示错误,

  #因为线程队列没有数据要取,所以会提示队列为空的消息。

  打印(数据,-)

  其他排队方法

  导入队列

  #创建队列

  q=队列。队列()

  #在线程队列中放一个值

  q.put([1,233333])

  q.put([2,小女孩])

  Q.put([3,{name :初音 }])

  #重视价值

  Print(q.qsize()) #队列值的数量

  print(q.empty()) #是空的吗?

  print(q.full()) #满了吗?

  q.task_done()

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: