如果要启动大量子进程, 可以用进程池的方式批量创建子进程.


Pool

使用类Pool可以创建进程池, 然后把各种数据处理任务都提交给进程池.

Pool([numprocess, initializer, initargs])

说明:

  1. numprocess是指要创建的线程数. 默认是cpu的核心数.(os.cpu_count()的返回值)

  2. initializer是每个进程启动时要执行的可调用对象, 默认是None

  3. initargs是传递给initializer的元组参数.


from multiprocessing import Pool


def foo(name):
    print("foo", name)


if __name__ == "__main__":
    p = Pool(3, foo, ("李四",))  # 创建进程池, 进程池中有三个进程


进程池对象的一些方法

1. p.apply(func[, args])

在进程池的一个工作进程中执行func函数, args是传给func的元组参数. 注意使用这个方法让多个进程去执行, 他们是同步执行的. 即:多个进程是顺序执行的.

func的返回值就是p.apply的返回值.

from multiprocessing import Pool


def foo1(num):
    return num ** 2


if __name__ == "__main__":
    p = Pool(3)  # 创建进程池, 进程池中有三个进程

    for x in range(3):
        r = p.apply(foo1, (x,))
        print(r)


2. p.apply_aync(func[, args, kwargs, callback])

异步的执行func

callback 是可调用对象, 当func执行结束, 则立即调用callback并把func的返回值传递给callback.

from multiprocessing import Pool
import time


def foo1(num):
    print("foo1", num)
    time.sleep(2)
    return num ** 2


if __name__ == "__main__":
    p = Pool(3)  # 创建进程池, 进程池中有三个进程

    for x in range(5):
        p.apply_async(foo1, (x,))

    p.close()
    print("等待子进程结束...")
    p.join()
    print("子进程执行完毕")
    print("主进程执行完毕")


3. p.close()

关闭进程池, 防止进一步提交任务.


4. p.join()

等待所有工作进程退出. 此方法只能在close()terminate()方法之后调用.


5. p.terminate()

立即停止所有的进程, 同时不进行清理和结束已经挂起的动作.


AsyncResult对象(apply_async()的返回值)

apply_async()的返回值是AsyncResult实例. 具有如下方法:

1. a.get([timeout])

等待返回结果, 结果就是任务函数的返回值.

2. a.ready()

如果任务函数执行结束返回True

3. a.successful()

如果任务函数执行结束, 且在执行的过程中没有发生异常则

4. a.wait([timeout])

等待任务结束, 这个方法与get()的区别就是它没有返回值.


from multiprocessing import Pool
import time


def foo1(num):
    print("foo1", num)
    time.sleep(2)
    return num ** 2


if __name__ == "__main__":
    p = Pool(3)  # 创建进程池, 进程池中有三个进程

    for x in range(5):
        a = p.apply_async(foo1, (x,))
        print(a.get(), a.successful())

    p.close()
    print("等待子进程结束...")
    p.join()
    print("子进程执行完毕")
    print("主进程执行完毕")

Copyright © 李振超 2018 all right reserved,powered by Gitbook
该文件最后修订时间: 2018-02-25 07:12:09

results matching ""

    No results matching ""