Python- threading多线程&Queue

版权声明:转载请注明出处。 https://blog.csdn.net/paopaohll/article/details/83244105

Python threading多线程编程+queue实现线程间的变量共享

threading:

  1. 直接调用threading.Thread()创建子线程
  2. 通过继承threading.Thread,自定义Thread类实现实例化创建子线程

queue:

  1. queue利用阻塞实现了线程安全
  2. 创建queue后,利用global关键字在类或者函数内部实现共享
import threading
import time
from queue import Queue

music_album = ['One hundred miles', 'Two hundred miles', 'Three hundred miles', 'Four hundred miles',
               'Five hundred miles', 'Six hundred miles', 'Seven hundred miles', 'Eight hundred miles',
               'Nine hundred miles', 'Ten hundred miles', ]

q = Queue(3)


class Music_Cols(threading.Thread):
    def __init__(self, name):
        super().__init__(name=name)

    def run(self):
        global music_album
        global q
        num = 0
        while True:
            try:
                music = music_album[num]
                q.put(music)
            except IndexError:
                break
            num += 1


class Music_Play(threading.Thread):
    def __init__(self, name):
        super().__init__(name=name)

    def run(self):
        global q
        while True:
            if q.not_empty:
                music = q.get()
                print('{}正在播放{}'.format(threading.current_thread(), music))
                time.sleep(20)
                q.task_done()
                print('{}播放结束'.format(music))
            else:
                break


if __name__ == '__main__':
    mc_thread = Music_Cols('music_cols')
    mc_thread.setDaemon(True) # 设置为守护进程,主线程退出时,子进程也kill掉
    mc_thread.start() # 启动进程
    for i in range(10):
        mp_thread = Music_Play('music_play')
        mp_thread.setDaemon(True)
        mp_thread.start()
	# 每当消息添加到队列时(put),队列消息计数器就会增加,可以利用get取出消息,只有子线程调用task_done函数后,队列消息计数器减少,当队列消息为零也就是计数器为0时,join()取消阻塞。
    q.join() # 阻塞,等待所有任务完成后取消阻塞


猜你喜欢

转载自blog.csdn.net/paopaohll/article/details/83244105
今日推荐