潭州课堂25班:Ph201805201 并发(进程与线程池) 第十四课 (课堂笔记)

循环执行一个线程

# -*- coding: utf-8 -*-
# 斌彬电脑
# @Time : 2018/7/20 0020 5:35
import threading
import queue
import time

class my_th(threading.Thread):

    def __init__(self):
        super().__init__()
        self.daemon = True         #  守护模型(主线程结束,所有子线程结束)
        self.queue = queue.Queue()


    def run(self):
        while True:
            fun = self.queue.get()     #  得到函数对象,
            fun()                   #  运行函数
            self.queue.task_done()
    #  队列中有任务,会不断的依次运行,


    def appy(self,fun):            #   添加任务
        self.queue.put(fun)

    def join(self, timeout=None):   #  重写 join 方法
        self.queue.join()            #  把队列的 join 方法写在里边
    #   当队列任务执行完毕就结,

def fun_1():
    time.sleep(2)
    print('aaaa')

t = my_th()
t.start()
t.appy(fun_1)
t.appy(fun_1)
t.appy(fun_1)
t.appy(fun_1)

t.join()    # 这里的 join 不是等待线程,而是等待队列任务执行完


#  始终只有一个线程在运行,

上边是任务有多个,但线程池中只有一个线程,2秒打印一个,

 

 

 自定义线程池

# -*- coding: utf-8 -*-
# 斌彬电脑
# @Time : 2018/7/20 0020 5:35
import threading
import queue
import time

class my_th(threading.Thread):

    def __init__(self,num):
        super().__init__()
        self.queue = queue.Queue()
        for i in range(1,num+1):
            t = threading.Thread(target=self.run, name='thread_{}'.format(i))
            t.daemon = True
            t.start()

    def run(self):
        while True:
            fun = self.queue.get()     #  得到函数对象,
            fun()                   #  运行函数
            self.queue.task_done()
    #  队列中有任务,会不断的依次运行,


    def appy(self,fun):            #   添加任务
        self.queue.put(fun)

    def join(self, timeout=None):   #  重写 join 方法
        self.queue.join()               #  把队列的 join 方法写在里边
    #   当队列任务执行完毕就结,

def fun_1():
    time.sleep(2)
    print('aaaa')

t = my_th(5)        #   () 创建线程个数,
t.appy(fun_1)
t.appy(fun_1)
t.appy(fun_1)
t.appy(fun_1)
t.appy(fun_1)
t.appy(fun_1)

t.join()    # 这里的 join 不是等待线程,而是等待队列任务执行完

  

 

 

进程池

# import multiprocessing
# from multiprocessing import Pool  # py自带的进程池
import time
from multiprocessing.dummy import Pool          #  线程池
from multiprocessing.pool import ThreadPool     #  线程池

pool = Pool(4)       #  实例池,他的大小默认是 cpu 核心个数

def func(i):
    print('..............',i)
    time.sleep(0.1)

if __name__ == '__main__':
    for i in range(10):
        pool.apply_async(func=func,args=(i,))       # 向池提交任务


    # pool.map(func,range(5))               # 与 pool.apply_async

    pool.close()                                    # 关闭池
    pool.join()                                     # 等待任务完毕

  
  
  # pool.terminate()

 

 

 

如果池中有返回值:

# import multiprocessing
# from multiprocessing import Pool  # py自带的进程池
import time
from multiprocessing.dummy import Pool          #  线程池
from multiprocessing.pool import ThreadPool     #  线程池

pool = Pool(4)       #  实例池,他的大小默认是 cpu 核心个数

def func(i):
    print('..............',i)
    time.sleep(0.1)
    return i

if __name__ == '__main__':
    a = []
    for i in range(10):
        p = pool.apply_async(func=func,args=(i,))       # 向池提交任务
        a.append(p.get())

    # pool.map(func,range(5))               # 与 pool.apply_async

    pool.close()                                    # 关闭池
    pool.join()                                     # 等待任务完毕
    for i in a:
        print(i)

    # pool.terminate()

  

 

posted @ 2018-07-20 06:13  25班Ph201805201  阅读(129)  评论(0编辑  收藏  举报