1. 程式人生 > >python 多程序 —— multiprocessing.Pool

python 多程序 —— multiprocessing.Pool

Pool

如果要啟動大量的子程序,可以用程序池的方式批量建立子程序.

class multiprocessing.Pool([processes[, initializer[, initargs[, maxtasksperchild]]]])

控制可以提交作業的工作程序池的程序池物件。它支援超時和回撥的非同步結果,並具有並行對映實現。

processes 是要使用的工作程序數。如果程序為None,則使用cpu_count()返回的數字。如果初始化程式不是無,則每個工作程序將在啟動時呼叫初始化程式(* initargs)。

請注意,池物件的方法只能由建立池的程序呼叫。

2.7版本中的新功能:maxtasksperchild是一個工作程序可以在退出之前完成的任務數,並將其替換為一個新的工作程序,以使未使用的資源被釋放。預設的maxtasksperchild是None,這意味著工作程序將生存只要池。

apply(func[, args[, kwds]])

等效於apply()內建函式。 它阻塞直到結果準備就緒,所以apply_async()更適合並行執行工作。 此外,func僅在池的一個工作人員中執行。

apply_async(func[, args[, kwds[, callback]]])

返回結果物件的apply()方法的變體。

如果指定回撥,那麼它應該是一個可接受單個引數的可呼叫函式。 當結果變得準備好時,應答回撥(除非呼叫失敗)。 回撥應該立即完成,否則處理結果的執行緒將被阻止。

close()

防止任何更多的任務被提交到池中。 一旦完成所有任務,工作程序將退出。

join()

等待工作程序退出。 在使用join()之前必須呼叫close()或terminate()。

使用 Pool.apply()

# -*- coding:utf-8 -*-
from multiprocessing import Pool
import os
import time
import random


def long_time_task(name):
    print('Run task %s (%s)...' % (name, os.getpid()))
    start = time.time()
    time.sleep(random.random() * 3
) end = time.time() print('Task %s runs %0.2f seconds.' % (name, (end - start))) if __name__ == '__main__': print('Parent process %s.' % os.getpid()) p = Pool(5) for i in range(5): # p.apply_async(long_time_task, args=(i,)) p.apply(long_time_task, args=(i,)) print('Waiting for all subprocesses done...') p.close() p.join() print('All subprocesses done.')

輸出:

Parent process 3924.
Run task 0 (2568)...
Task 0 runs 2.63 seconds.
Run task 1 (5708)...
Task 1 runs 0.01 seconds.
Run task 2 (12152)...
Task 2 runs 2.62 seconds.
Run task 3 (6888)...
Task 3 runs 2.92 seconds.
Run task 4 (8256)...
Task 4 runs 0.50 seconds.
Waiting for all subprocesses done...
All subprocesses done.

Process finished with exit code 0

使用 Pool.apply_async()

# -*- coding:utf-8 -*-
from multiprocessing import Pool
import os
import time
import random


def long_time_task(name):
    print('Run task %s (%s)...' % (name, os.getpid()))
    start = time.time()
    time.sleep(random.random() * 3)
    end = time.time()
    print('Task %s runs %0.2f seconds.' % (name, (end - start)))


if __name__ == '__main__':
    print('Parent process %s.' % os.getpid())
    p = Pool(5)
    for i in range(5):
        p.apply_async(long_time_task, args=(i,))
        # p.apply(long_time_task, args=(i,))

    print('Waiting for all subprocesses done...')
    p.close()
    p.join()
    print('All subprocesses done.')

輸出:

Parent process 12272.
Waiting for all subprocesses done...
Run task 0 (10036)...
Run task 1 (5400)...
Run task 2 (12152)...
Run task 3 (10372)...
Run task 4 (7548)...
Task 1 runs 0.58 seconds.
Task 4 runs 0.83 seconds.
Task 3 runs 1.92 seconds.
Task 2 runs 2.40 seconds.
Task 0 runs 2.48 seconds.
All subprocesses done.

Process finished with exit code 0

對Pool物件呼叫join()方法會等待所有子程序執行完畢,呼叫join()之前必須先呼叫close(),呼叫close()之後就不能繼續新增新的Process了。

相關推薦

Python 程序 multiprocessing.Pool類詳解

multiprocessing模組 multiprocessing包是Python中的多程序管理包。它與 threading.Thread類

python 程序 —— multiprocessing.Pool

Pool 如果要啟動大量的子程序,可以用程序池的方式批量建立子程序. class multiprocessing.Pool([processes[, initializer[, initargs[, maxtasksperchild]]]]) 控制可以提交

Python程序 multiprocessing.Pool

multiprocessing包是Python中的多程序管理包。它與 threading.Thread類似,可以利用multiprocessing.Process物件來建立一個程序。該程序可以允許放在Python程式內部編寫的函式中。該Process物件與Thread物件的用

Python 程序multiprocessing模組, Process, 程序Pool和Queue

1. multiprocessing模組提供了一個Process類來代表一個程序物件:  (1)   multiprocessing.Process(group=None, target=None, name=None, args=(), kwargs={}, *, daem

Python(程序multiprocessing模組)

day31 http://www.cnblogs.com/yuanchenqi/articles/5745958.html 由於GIL的存在,python中的多執行緒其實並不是真正的多執行緒,如果想要充分地使用多核CPU的資源,在python中大部分情況需要使用多程序。Python提供了非常好用的多程序包

Python 程序multiprocessing

一、python多執行緒其實在底層來說只是單執行緒,因此python多執行緒也稱為假執行緒,之所以用多執行緒的意義是因為執行緒不停的切換這樣比序列還是要快很多。python多執行緒中只要涉及到io或者sleep就會切換執行緒。因此在io密集型的情況下可以用多執行緒。 二、python的多程序是直接呼叫原生程

Python 程序 multiprocessing 上篇

''' Python由於全域性直譯器鎖(GIL)的存在,多執行緒並不能發揮多核的效能。 實際上,即使使用多執行緒,每時刻執行的只是一個執行緒,因為只有執行緒獲得GIL鎖才可以執行。 在某一執行緒執行100條位元組碼或者進入IO操作的時候,會釋放GIL,切入另一個執行緒。 因此,為了發揮多核的效能,我們

Python 程序 multiprocessing 中篇

# 共享記憶體 share memory ''' 如果多個程序要訪問相同的變數,應該使用共享記憶體 multiprocessing 有兩種共享記憶體, Value和Array 注意,這裡的Array只能是一維的。 ''' ''' 訪問Value v1不能直接把v1當作值 要通過v1.value得到值

Python程序 multiprocessing 筆記

簡介 Python多程序主要集中在multiprocessing模組中實現相關功能。如 程序的建立(Process) Pool的使用(Pool) 多個程序之間的資料交換(Queue, Pipes) 多個程序之間資料共享(Value, Array, Man

Python程序——multiprocessing.Process

1.multiprocessing.Process class Process(multiprocessing.process.BaseProcess) | Process objects represent activity that is run in

Python程序Multiprocessing學習筆記

參考:https://morvanzhou.github.io/tutorials/python-basic/multiprocessing/1-why/ 1 什麼是Multiprocessing 多核計算、多程序計算 多程序 Multiprocessing 和多執行緒 t

python ---程序 Multiprocessing

  和 threading 的比較  多程序 Multiprocessing 和多執行緒 threading 類似, 他們都是在 python 中用來並行運算的. 不過既然有了 threading, 為什麼 Python 還要出一個 multiprocessing 呢? 原因很簡單,

31 Python 程序-multiprocessing

Python 多程序程式設計 - multiprocessing模組 程序 程序的概念 ​ 程序是作業系統中最基本的概念。在多道程式系統出現後,為了刻畫系統內部出現的動態情況,描述系統內部各道程式的活動規律引進的一個概念,所有多道程式設計

python程序 程序池:multiprocessing.pool

在利用Python進行系統管理的時候,特別是同時操作多個檔案目錄,或者遠端控制多臺主機,並行操作可以節約大量的時間。當被操作物件數目不大時,可以直接利用multiprocessing中的Process動態成生多個程序,十幾個還好,但如果是上百個,上千個目標,手動的去限制程序數

PythonPython程序multiprocessing程序Pool的返回值順序

問題起因最近要將一個文字分割成好幾個topic,每個topic設計一個regressor,各regressor是相互獨立的,最後彙總所有topic的regressor得到總得預測結果。沒錯!類似bagging ensemble!只是我沒有抽樣。文字不大,大概3000行,top

Python 程序並行程式設計實踐: multiprocessing 模組

Python 多程序並行程式設計實踐: multiprocessing 模組 2017/04/17 · 實踐專案 · multiprocessing, 多程序, 並行 本文作者: 伯樂線上 - iPytLab&n

Python程序併發操作程序Pool

目錄: multiprocessing模組 Pool類 apply apply_async map close terminate join 程序例項 multiprocessing模組 如果你打算編寫多程序的服務程式,Unix/

python程序的理解 multiprocessing Process join run

multiprocessing模組。 multiprocessing模組會在windows上時模擬出fork的效果,可以實現跨平臺,所以大多數都使用multiprocessing。 下面給一段簡單的程式碼,演示一下建立程序: #encoding:utf-8 from multipr

python程序———9、multiprocessing程序程式設計

python多程序的multiprocessing的用法跟多執行緒threading的用法基本差不多,直接上程式碼吧   import multiprocessing import os import time #fork()只能在linux中使用 # pid = os.fork

Python程序 併發 multiprocessing

庫:multipprocessing 例項: #!/usr/bin/env python # -*- coding:utf-8 -*- import multiprocessing import time def action(sub_process_name): f