1. 程式人生 > >進程池

進程池

回調 def {} 作用 維護 sin 支持 multi 註釋

一、前言

  進程池內部維護一個進程序列,當使用時,則去進程池中獲取一個進程,如果進程池序列中沒有可供使用的進程,那麽程序就會等待,直到進程池中有可用進程為止。進程池的作用可以在多進程程序中有效的控制進程運行的個數,維護系統的穩定。

二、multiprocessing.pool

  2.1 apply(func, args=(), kwds={})

  默認阻塞,所有進程是串行的,不建議使用

from multiprocessing import Pool
import time
import os


def foo(i):
    time.sleep(2)
    print(‘in process‘, os.getpid())
    return i + 100


if __name__ == ‘__main__‘:   # windows 運行進程池一定要加這

    pool = Pool(5)   # 進程池中進程個數為5,多余的進程先掛起

    for i in range(10):
        pool.apply(func=foo, args=(i,))

    print(‘end‘)
    pool.close()
    pool.join()  # 進程池中進程執行完畢後再關閉,如果註釋,那麽程序直接關閉。

  註:所有進程會依次運行,主進程等待所有進程結束

  2.2 apply_async(func, args=(), kwds={}, callback=None, error_callback=None)

  非阻塞,進程池中的進程並行,支持回調 

from multiprocessing import Pool
import time
import os


def foo(i):
    time.sleep(1)
    print(‘in process‘, os.getpid())
    return i + 100


if __name__ == ‘__main__‘:   # windows 運行進程池一定要加這

    pool = Pool(5)   # 進程池中進程個數為5,多余的進程先掛起

    for i in range(10):
        pool.apply_async(func=foo, args=(i,))


    print(‘end‘)
    pool.close()
    pool.join()  # 進程池中進程執行完畢後再關閉,如果註釋,那麽程序直接關閉。

三、回調函數

   在apply_async中執行回調函數,每執行完一個子進程,主進程就調用一下回調函數,回調函數執行完後再執行下一個子進程 

# -*- coding: UTF-8 -*-

from multiprocessing import Pool
import time
import os


def foo(i):
    time.sleep(1)
    print(‘in process‘, os.getpid())
    return i + 100


def bar(arg):   # 增加的回到函數, 其實回調函數是主進程執行的
    print(‘-->exec done:‘, arg, os.getpid())


if __name__ == ‘__main__‘:   # windows 運行進程池一定要加這

    pool = Pool(5)   # 進程池中進程個數為5,多余的進程先掛起
    print(‘main process pid,‘, os.getpid())
    for i in range(10):
        pool.apply_async(func=foo, args=(i,), callback=bar)
        # pool.apply(func=foo, args=(i,))

    print(‘end‘)
    pool.close()
    pool.join()  # 進程池中進程執行完畢後再關閉,如果註釋,那麽程序直接關閉。

  註:通過進程pid可以看出,回調函數其實是由主進程執行的 

進程池