欢迎来到山村网

Python多线程和队列操作实例

2019-03-02 14:15:55浏览:432 来源:山村网   
核心摘要:  这篇文章主要介绍了Python多线程和队列操作实例,本文直接给给实例代码,需要的朋友可以参考下  Python3,开一个线程,间隔1

  这篇文章主要介绍了Python多线程和队列操作实例,本文直接给给实例代码,需要的朋友可以参考下

  Python3,开一个线程,间隔1秒把一个递增的数字写入队列,再开一个线程,从队列中取出数字并打印到终端

  代码如下:

  #! /usr/bin/env python3

  import time

  import threading

  import queue

  # 一个线程,间隔一定的时间,把一个递增的数字写入队列

  # 生产者

  class Producer(threading.Thread):

  def __init__(self, work_queue):

  super().__init__() # 必须调用

  self.work_queue = work_queue

  def run(self):

  num = 1

  while True:

  self.work_queue.put(num)

  num = num+1

  time.sleep(1) # 暂停1秒

  # 一个线程,从队列取出数字,并显示到终端

  class Printer(threading.Thread):

  def __init__(self, work_queue):

  super().__init__() # 必须调用

  self.work_queue = work_queue

  def run(self):

  while True:

  num = self.work_queue.get() # 当队列为空时,会阻塞,直到有数据

  print(num)

  def main():

  work_queue = queue.Queue()

  producer = Producer(work_queue)

  producer.daemon = True # 当主线程退出时子线程也退出

  producer.start()

  printer = Printer(work_queue)

  printer.daemon = True # 当主线程退出时子线程也退出

  printer.start()

  work_queue.join() # 主线程会停在这里,直到所有数字被get(),并且task_done(),因为没有调用task_done(),所在这里会一直阻塞,直到用户按^C

  if __name__ == '__main__':

  main()

  queue是线程安全的,从多个线程访问时无需加锁。

  如果在work_queue.get()之后调用work_queue.task_done(),那么在队列空时work_queue.join()会返回。

  这里work_queue.put()是间隔一定时间才往队列放东西,如果调用work_queue.task_done(),在数字1被get()后,队列空时,join()就返回,程序就结束了。

  也就是程序只打印了1然后就退出了。

  所以在这种使用情景下,不能调用task_done(),程序会一直循环下去。

(责任编辑:豆豆)
下一篇:

Python文件读取的3种方法及路径转义

上一篇:

Python中type的构造函数参数含义说明

  • 信息二维码

    手机看新闻

  • 分享到
打赏
免责声明
• 
本文仅代表作者个人观点,本站未对其内容进行核实,请读者仅做参考,如若文中涉及有违公德、触犯法律的内容,一经发现,立即删除,作者需自行承担相应责任。涉及到版权或其他问题,请及时联系我们 xfptx@outlook.com