python多进程实例

from concurrent.futures import ProcessPoolExecutor
from datetime import datetime
import time

def work(x):
    x += 1
    time.sleep(10)
    return x

def help(x):
    x -= 1
    time.sleep(10)
    return x

def done(r):
    print(r.result())

if __name__ == '__main__':
    data = [1,2]
    x = 1

    with ProcessPoolExecutor() as pool:

        #方式一:数据都用同一函数,则直接用map
        # results = pool.map(work, data)  #data是处理数据的集合
        # print(list(results))

        # 方式二:数据各用不同函数,则使用submit
       1)
   r = pool.submit(work, x)     #x是待处理数据,相当于data的子元素
        r.add_done_callback(done)    #回调函数(必备),不然直接获取result,会阻塞后面提交的submit,就变变串行

 

  2)

        r = pool.submit(help, x)
        r.add_done_callback(done)
 
  3)对每个单独提交的进程的返回值进行合并
  fs = []
  for i in range(10):
    fs.append(pool.submit(help, i))
  ret = []
  for r in concurrent.futures.as_completed(fs):
    ret = ret  + r.result() #直接使用result获取函数,会阻塞,但也是多进程,且时间差距不大。
 
 
 

附:1、向pool.map中传入多个参数的做法:

  def func(x,y,z):
    ...
  results = pool.map(func,  *zip(*data))                #*zip(*)使用的非常巧妙
       
posted @ 2022-01-17 16:00  cookall  阅读(125)  评论(0)    收藏  举报