線程池

線程池

一、“池”的概念

在這裏插入圖片描述

二、“池”的實現

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# author:DM time:2019/8/2 22:18

from threading import Thread, current_thread
from queue import Queue
import time
from multiprocessing.pool import ThreadPool  # 內置模塊
# 方法一: 自建線程池
# class My_ThreadPool(object):
#     def __init__(self, n):  # 參數n是可重複使用的線程數(同時也是隊列的長度)
#         # 生成一個隊列,裏面放任務
#         self.q = Queue(n)
#         # 生成線程
#         for i in range(n):
#             Thread(target=self.worker, daemon=True).start()
# 
#     def worker(self):
#         """實現從隊列裏取任務完成"""
#         while True:  # 死循環,這樣線程纔會一直不結束,一直使用下去
#             func, args, kwargs = self.q.get()   # 從隊列去取任務
#             func(*args, **kwargs)   # 運行剛得到的任務
#             self.q.task_done()  # 執行完,通知隊列
# 
#     def put_q(self, func, args=(), kwargs={}):
#         """實現往隊列裏放任務"""
#         self.q.put((func, args, kwargs))
# 
#     def join_q(self):
#         self.q.join()   # 阻塞,等待完成

# 要執行的任務:
def task1():
    print('我是線程{}我正在執行task1'.format(current_thread().name))
    time.sleep(3)
    print('我是線程{}我執行task1完畢'.format(current_thread().name))


def task2(*args, **kwargs):
    print('我是線程{}我正在執行task2'.format(current_thread().name))
    print("我接收的參數是", args, kwargs)
    time.sleep(3)
    print('我是線程{}我執行task2完畢'.format(current_thread().name))


if __name__ == '__main__':
    # 自建線程池的使用:
    # pool = My_ThreadPool(2)
    # pool.put_q(task1)
    # pool.put_q(task2, args=(1, 2), kwargs={'a': 1, 'b': 2})
    # print('任務提交完成')
    # pool.terminate()    # 終止線程池,終止所有的任務
    # pool.join_q()
    # print('所有任務完成')


    # 內置線程池的使用:
    pool = ThreadPool()
    pool.apply_async(task1)
    pool.apply_async(task2, args=(1, 2), kwds={'a': 1, 'b': 2})
    print('任務提交完成')
    pool.close()
    pool.join()
    print('所有任務完成')

練習

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# author: DM time: 2019/8/5  15:30


from threading import Thread, current_thread
from queue import Queue
import time
from multiprocessing.pool import ThreadPool  # 內置線程池模塊
# 方法一: 自建線程池
# class My_ThreadPool(object):
#     def __init__(self, n):  # 參數n是可重複使用的線程數(同時也是隊列的長度)
#         # 生成一個隊列,裏面放任務
#         self.q = Queue(n)
#         # 生成線程
#         for i in range(n):
#             Thread(target=self.worker, daemon=True).start()  # 生成並運行線程
#
#     def worker(self):
#         """實現從隊列裏取任務完成"""
#         while True:  # 死循環,這樣線程纔會一直不結束,一直使用下去
#             func= self.q.get()   # 從隊列去取任務
#             func()   # 運行剛得到的任務
#             self.q.task_done()  # 執行完,通知隊列
#
#     def put_q(self, func):
#         """實現往隊列裏放任務"""
#         self.q.put(func)
#
#     def join_q(self):
#         self.q.join()   # 阻塞,等待完成

# 要執行的任務:
def task1():
    print('我是線程{}我正在執行task1'.format(current_thread().name))
    time.sleep(3)
    print('我是線程{}我執行task1完畢'.format(current_thread().name))

def task2(*args, **kwargs):
    print('我是線程{}我正在執行task2'.format(current_thread().name))
    print("我接收的參數是", args, kwargs)
    time.sleep(3)
    print('我是線程{}我執行task2完畢'.format(current_thread().name))

if __name__ == '__main__':
    # 自建線程池的使用:
    # pool = My_ThreadPool(2)
    # pool.put_q(task1)
    # pool.put_q(task2(1, 2, **{'a': 1, 'b': 2}))
    # print('任務提交完成')
    # pool.join_q()
    # print('所有任務完成')

    # 內置線程池的使用:
    pool = ThreadPool()
    pool.apply_async(task1)
    pool.apply_async(task2(1, 2, **{'a': 1, 'b': 2}))
    print('任務提交完成')
    pool.terminate()  # 終止線程池,終止所有的任務
    pool.close()
    pool.join()
    print('所有任務完成')
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章