日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python进程池调用实例方法_Python 多进程并发操作中进程池Pool的实例

發布時間:2024/4/19 python 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python进程池调用实例方法_Python 多进程并发操作中进程池Pool的实例 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在利用Python進行系統管理的時候,特別是同時操作多個文件目錄,或者遠程控制多臺主機,并行操作可以節約大量的時間。當被操作對象數目不大時,可以直接利用multiprocessing中的Process動態成生多個進程,10幾個還好,但如果是上百個,上千個目標,手動的去限制進程數量卻又太過繁瑣,這時候進程池Pool發揮作用的時候就到了。

Pool可以提供指定數量的進程,供用戶調用,當有新的請求提交到pool中時,如果池還沒有滿,那么就會創建一個新的進程用來執行該請求;但如果池中的進程數已經達到規定最大值,那么該請求就會等待,直到池中有進程結束,才會創建新的進程來它。這里有一個簡單的例子:

#!/usr/bin/env python

#coding=utf-8

"""

Author: Squall

Last modified: 2011-10-18 16:50

Filename: pool.py

Description: a simple sample for pool class

"""

from multiprocessing import Pool

from time import sleep

def f(x):

for i in range(10):

print '%s --- %s ' % (i, x)

sleep(1)

def main():

pool = Pool(processes=3) # set the processes max number 3

for i in range(11,20):

result = pool.apply_async(f, (i,))

pool.close()

pool.join()

if result.successful():

print 'successful'

if __name__ == "__main__":

main()

先創建容量為3的進程池,然后將f(i)依次傳遞給它,運行腳本后利用ps aux | grep pool.py查看進程情況,會發現最多只會有三個進程執行。pool.apply_async()用來向進程池提交目標請求,pool.join()是用來等待進程池中的worker進程執行完畢,防止主進程在worker進程結束前結束。但必pool.join()必須使用在pool.close()或者pool.terminate()之后。其中close()跟terminate()的區別在于close()會等待池中的worker進程執行結束再關閉pool,而terminate()則是直接關閉。result.successful()表示整個調用執行的狀態,如果還有worker沒有執行完,則會拋出AssertionError異常。

利用multiprocessing下的Pool可以很方便的同時自動處理幾百或者上千個并行操作,腳本的復雜性也大大降低。

——————————————————————————————————

Python多進程并發(multiprocessing)

由于Python設計的限制(我說的是咱們常用的CPython)。最多只能用滿1個CPU核心。

Python提供了非常好用的多進程包multiprocessing,你只需要定義一個函數,Python會替你完成其他所有事情。借助這個包,可以輕松完成從單進程到并發執行的轉換。

1、新建單一進程

如果我們新建少量進程,可以如下:

import multiprocessing

import time

def func(msg):

for i in xrange(3):

print msg

time.sleep(1)

if __name__ == "__main__":

p = multiprocessing.Process(target=func, args=("hello", ))

p.start()

p.join()

print "Sub-process done."

2、使用進程池

是的,你沒有看錯,不是線程池。它可以讓你跑滿多核CPU,而且使用方法非常簡單。

注意要用apply_async,如果落下async,就變成阻塞版本了。

processes=4是最多并發進程數量。

import

multiprocessing

import

time

def

func(msg):

for

i

in

xrange(3):

print

msg

time.sleep(1)

if

__name__

==

"__main__":

pool

=

multiprocessing.Pool(processes=4)

for

i

in

xrange(10):

msg

=

"hello

%d"

%(i)

pool.apply_async(func,

(msg,

))

pool.close()

pool.join()

print

"Sub-process(es)

done."

3、使用Pool,并需要關注結果

更多的時候,我們不僅需要多進程執行,還需要關注每個進程的執行結果,如下:

import multiprocessing

import time

def func(msg):

for i in xrange(3):

print msg

time.sleep(1)

return "done " + msg

if __name__ == "__main__":

pool = multiprocessing.Pool(processes=4)

result = []

for i in xrange(10):

msg = "hello %d" %(i)

result.append(pool.apply_async(func, (msg, )))

pool.close()

pool.join()

for res in result:

print res.get()

print "Sub-process(es) done."

2014.12.25更新

根據網友評論中的反饋,在Windows下運行有可能崩潰(開啟了一大堆新窗口、進程),可以通過如下調用來解決:

multiprocessing.freeze_support()

簡易worker multiprocessing.Pool

多任務模型設計是一個比較復雜的邏輯,但是python對于多任務的處理卻有種種方便的類庫,不需要過多的糾結進程/線程間的操作細節。比如multiprocessing.Pool就是其中之一。

官方給的范例也很簡單。

from multiprocessing import Pool

def f(x):

return x*x

if __name__ == '__main__':

pool = Pool(processes=4) # start 4 worker processes

result = pool.apply_async(f, [10]) # evaluate "f(10)" asynchronously

print result.get(timeout=1) # prints "100" unless your computer is *very* slow

print pool.map(f, range(10)) # prints "[0, 1, 4,..., 81]"

并未做太多的詳細解釋。正好我手頭有一段代碼,需要請求幾百個url,解析html頁面獲取一些信息,單線程for循環效率極低,因此看到了這個模塊,想用這個實現多任務分析,參考代碼如下:

from multiprocessing import Pool

def analyse_url(url):

#do something with this url

return analysis_result

if __name__ == '__main__':

pool = Pool(processes=10)

result = pool.map(analyse_url, url_list)

確實比以前單線程for循環url_list列表,一個個請求analyse_url要快得多,但是帶來的問題就是一旦pool.map沒執行完就ctrl-c中斷程序,程序就會異常,永遠無法退出,參考stackoverflow的這個帖子,修改為以下代碼:

#result = pool.map(analyse_url, url_list)

result = pool.map_async(analyse_url, url_list).get(120)

至此問題完美解決。

以上這篇Python 多進程并發操作中進程池Pool的實例就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持我們。

本文標題: Python 多進程并發操作中進程池Pool的實例

本文地址: http://www.cppcns.com/jiaoben/python/209637.html

總結

以上是生活随笔為你收集整理的python进程池调用实例方法_Python 多进程并发操作中进程池Pool的实例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。