.Tang

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

可以重复利用的线程

 

# -*- coding: utf-8 -*-
""" 线程重复使用 """

from threading import Thread
from queue import Queue


def func(a, b, c):
    print('a')

def func1(a, b):
    print('b')

# 子线程
class Mythread(Thread):
    def __init__(self):
        super().__init__()
        self.queue = Queue(3) # __init__在函数执行前运行,也就是在主线程执行的
        self.daemon = True # 设置为守护线程

    def run(self):
        while True:
            func, args, kwargs = self.queue.get()
            func(*args, **kwargs)
            self.queue.task_done() # 队列计数器 -1

    def apply_async(self, func, args=(), kwargs={}):
        self.queue.put((func, args, kwargs)) # 队列计数器 +1
        # print(self.queue.qsize())

    def join(self):
        self.queue.join() # 重写thread join方法,调用queue join



if __name__ == "__main__":
    my_thread = Mythread()
    # 传参
    my_thread.apply_async(func, (1, 2, 3)) # 调用apply_async方法在主线程中执行  计数器 +1
    my_thread.apply_async(func1, (1, 2)) #   计数器 +2
    my_thread.start()
    my_thread.join()
    ''' 思路:设置为守护线程(主线程结束子线程就结束)。join方法在主线程调用使得主线程处于阻塞,
    一直到子线程中的计数器为0才解阻塞。此时主线程结束,子线程也结束 '''

 

posted on 2019-04-01 19:30  .Tang  阅读(165)  评论(0编辑  收藏  举报