网络编程——线程池

在一个池子里,放固定数量的线程,这些线程等待任务,一旦有任务来,就有线程自发的去执行任务。

 

concurrent.futures  这个模块是异步调用的机制

concurrent.futures  提交任务都是用submit

for + submit 多个任务的提交

shutdown 是等效于Pool中的close + join ,是不允许再继续向池中增加任务,然后让父进程(线程)等待池中所有进程执行完所有任务。

 

如何把多个任务扔进池中?

  要么使用 for+ submit 的方式去提交多个任务

 

  要么直接使用map(func,iterable)方式去提交多个任务

  

from concurrent.futures import ThreadPoolExecutor
import time

def func(num):
    sum = 0
    for i in range(num):
        sum += i **2
    print(sum)

t = ThreadPoolExecutor(20)
start = time.time()
t.map(func, range(1000))
t.shutdown()
print(time.time() - start)

 

不同的方式提交多个任务(for + submit 或者map), 拥有不同的拿结果的方式

  如果是for + submit 的方式提交任务,拿结果用result方法

  如果是用map的方式提交任务,结果是一个生成器,采用__next__()的方式去拿结果

 

from concurrent.futures import ThreadPoolExecutor

def func(num):
    sum = 0
    for i in range(num):
        sum += i **2
    return sum

t = ThreadPoolExecutor(20)

res = t.map(func, range(100))
t.shutdown()

while 1:
    try:
        print(res.__next__())
    except:
        StopIteration

 

关于回调函数,不管是Pool进程池的方式,还是ProcessPoolExecutor的方式开启进程池,

回调函数都是由父进程调用

 

关于回调函数,ThreadPoolExecutor

回调函数是由父进程调用

 

posted @ 2018-08-27 16:09  Morallz  阅读(242)  评论(0编辑  收藏  举报