python-简单的线程池的实现

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# 多进程服务器   创建 销毁
# 通过提前创建好线程  当任务来了 就分配线程去执行

"""
主线程: 相当于生产者,只管向线程池提交任务。
               并不关心线程池是如何执行任务的。
               因此,并不关心是哪一个线程执行的这个任务。
线程池: 相当于消费者,负责接收任务,
               并将任务分配到一个空闲的线程中去执行。
"""

from threading import Thread
from queue import Queue
import time


class ThreadPool:
    def __init__(self, n):  # 意味着传啦几次
        self.queue = Queue()
        for i in range(n+1):   # 每个线程都去执行类里面的func方法
            Thread(target=self.work, args=(self.queue, ), daemon=True).start()

    def work(self):
        while True:
            func, args, kwargs = self.queue.get()
            func(*args, **kwargs)
            self.queue.task_done()

    def apply_async(self, func, args=(), kwargs={}):   # 主线程调用的
        self.queue.put((func, args, kwargs))   # 扔到队列里面

    def join(self):
        self.queue.join()

def task1():
    time.sleep(2)
    print("111")

def task2():
    time.sleep(2)
    print("222222")

pool = ThreadPool(2)
pool.apply_async(task1)
pool.apply_async(task2)
print("任务提交完成")
pool.join()
print("任务完成")
0%