python:进程池

1,进程可以无限开吗?

进程不可以无限开,cpu有十六核,代表可以同时处理16个任务,如果有160个进程,每个进程

处理需要0.01s,16核的处理器处理160个进程就需要0.5s,因为进程越多需要的时间越多。

2,进程池

import os
import time
import random
from multiprocessing import Pool
from multiprocessing import Process
def func(i):
    i += 1
if __name__ == '__main__':
    p = Pool(5)          # 创建了5个进程。一般来说,这里的数值是核数#+1,如果不知道cpu的核数是多少,可以调用os.cpu_count()查看
    start = time.time()
    p.map(func,range(1000))   # target = func  args=next(iterable)  # [(1,2,3),1,2,3,4]
    p.close()   # 是不允许再向进程池中添加任务
    p.join()
    print(time.time() - start)
    start = time.time()
    l = []
    for i in range(1000):
        p = Process(target=func,args=(i,))  # 创建了一百个进程
        p.start()
        l.append(p)
    [i.join() for i in l]
    print(time.time() - start)

3,

import time
from multiprocessing import Pool
# apply

def func(i):
    time.sleep(1)
    i += 1
    # print(i)
    return i+1

if __name__ == '__main__':
    p = Pool(5)
    res_l = []
    for i in range(20):
        # p.apply(func,args=(i,))   # apply是同步提交任务的机制
        res = p.apply_async(func,args=(i,))  # apply_async是异步提交任务的机制
        res_l.append(res)
        # print(res.get())   # 阻塞 :等待着任务结果
    p.close() # close必须加在join,不允许再添加新的任务了
    p.join()  # 等待子进程结束再往下执行
    [print(i.get()) for i in res_l]

 

posted @ 2018-02-05 19:07  kakawith  阅读(286)  评论(0编辑  收藏  举报