python中的线程池

一、自定义线程池

#!/usr/bin/env python
# encoding: utf-8
"""
@author: wanwei
@license: (C) Copyright 2013-2017, Node Supply Chain Manager Corporation Limited.
@contact: [email protected]
@software: pycharm
@file: threadpool_demo.py
@time: 2019/5/14 15:28
@desc:

原理
1.创建线程池

2.将任务扔进去

3.关闭线程池

4.等待线程任务执行完毕
"""

from multiprocessing.pool import ThreadPool
import time

pool = ThreadPool(2)

def task1():
    time.sleep(2)
    print('task1 over...........')

def task2(*args, **kwargs):
    time.sleep(3)
    print('task2 over...........', args, kwargs)

# 将任务丢进线程池
pool.apply_async(task1)
pool.apply_async(task2,args=[1,2,3],kwds={'asd': 2})
pool.apply_async(task2,args=[1],kwds={'asd': 2,'sdfsd': 12231})
print('task submitted')
# 要点close必须在join之前,不允许再提交任务了
pool.close()
pool.join()
print('mission complete')

二、python内置线程池

#!/usr/bin/env python
# encoding: utf-8
"""
@author: wanwei
@license: (C) Copyright 2013-2017, Node Supply Chain Manager Corporation Limited.
@contact: [email protected]
@software: pycharm
@file: MyThreadPool.py
@time: 2019/5/14 17:09
@desc:
"""

import queue
import time
import threading

RUN = 0
CLOSE = 1
TERMINATE = 2

class MyThreadPool:

    def __init__(self, n):
        self.queue_obj = queue.Queue()
        for i in range(n):
            threading.Thread(target=self.worker, daemon=True).start()

    def worker(self):
        while True:
            func = self.queue_obj.get("func")
            args = self.queue_obj.get("args")
            kwargs = self.queue_obj.get("kwargs")
            if args or kwargs:
                func(args, kwargs)
            else:
                func()
            self.queue_obj.task_done()
            # if self.queue_obj._state == CLOSE:
            #     break

    def apply_async(self, func, args=(), kwargs={}):
        # self.args = args
        # self.kwargs = kwargs
        self.queue_obj.put(func)
        self.queue_obj.put(args)
        self.queue_obj.put(kwargs)

    def join(self):
        self.queue_obj.join()

def task1():
    time.sleep(2)
    print('task1 over...........')

def task2(*args, **kwargs):
    time.sleep(3)
    print('task2 over...........', args, kwargs)

pool = MyThreadPool(2)
# 将任务丢进线程池
pool.apply_async(task1)
pool.apply_async(task2, args=[1,2,3], kwargs={'asd': 2})
pool.apply_async(task2, args=[1], kwargs={'asd': 2, 'sdfsd': 12231})
print('task submitted')
pool.join()
print('mission complete')

你可能感兴趣的:(python)