亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

python實現(xiàn)多進程代碼示例

 更新時間:2018年10月31日 09:33:07   作者:Kalankalan  
Python中大部分情況下都需要使用多進程,Python中提供了multiprocessing這個包實現(xiàn)多進程。multiprocessing支持子進程、進程間的同步與通信,本文就詳細的介紹一下

想要充分利用多核CPU資源,Python中大部分情況下都需要使用多進程,Python中提供了multiprocessing這個包實現(xiàn)多進程。multiprocessing支持子進程、進程間的同步與通信,提供了Process、Queue、Pipe、Lock等組件。

開辟子進程

multiprocessing中提供了Process類來生成進程實例

Process([group [, target [, name [, args [, kwargs]]]]])

  • group分組,實際上不使用
  • target表示調(diào)用對象,你可以傳入方法的名字
  • args表示給調(diào)用對象以元組的形式提供參數(shù),比如target是函數(shù)a,他有兩個參數(shù)m,n,那么該參數(shù)為args=(m, n)即可
  • kwargs表示調(diào)用對象的字典
  • name是別名,相當于給這個進程取一個名字

先來個小例子:

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


def run_proc(wTime):
  n = 0
  while n < 3:
    print "subProcess %s run," % os.getpid(), "{0}".format(time.ctime())  #獲取當前進程號和正在運行是的時間
    time.sleep(wTime)  #等待(休眠)
    n += 1

if __name__ == "__main__":
  p = Process(target=run_proc, args=(2,)) #申請子進程
  p.start()   #運行進程
  print "Parent process run. subProcess is ", p.pid
  print "Parent process end,{0}".format(time.ctime())

運行結(jié)果:

Parent process run. subProcess is 30196
Parent process end,Mon Mar 27 11:20:21 2017
subProcess 30196 run, Mon Mar 27 11:20:21 2017
subProcess 30196 run, Mon Mar 27 11:20:23 2017
subProcess 30196 run, Mon Mar 27 11:20:25 2017

根據(jù)運行結(jié)果可知,父進程運行結(jié)束后子進程仍然還在運行,這可能造成僵尸( zombie)進程。

通常情況下,當子進程終結(jié)時,它會通知父進程,清空自己所占據(jù)的內(nèi)存,并在內(nèi)核里留下自己的退出信息。父進程在得知子進程終結(jié)時,會從內(nèi)核中取出子進程的退出信息。但是,如果父進程早于子進程終結(jié),這可能造成子進程的退出信息滯留在內(nèi)核中,子進程成為僵尸(zombie)進程。當大量僵尸進程積累時,內(nèi)存空間會被擠占。

有什么辦法可以避免僵尸進程呢?

這里介紹進程的一個屬性 deamon,當其值為TRUE時,其父進程結(jié)束,該進程也直接終止運行(即使還沒運行完)。
所以給上面的程序加上p.deamon = true,看看效果。

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


def run_proc(wTime):
  n = 0
  while n < 3:
    print "subProcess %s run," % os.getpid(), "{0}".format(time.ctime())
    time.sleep(wTime)
    n += 1

if __name__ == "__main__":
  p = Process(target=run_proc, args=(2,))
  p.daemon = True  #加入daemon
  p.start()
  print "Parent process run. subProcess is ", p.pid
  print "Parent process end,{0}".format(time.ctime())

執(zhí)行結(jié)果:

Parent process run. subProcess is 31856
Parent process end,Mon Mar 27 11:40:10 2017

這是問題又來了,子進程并沒有執(zhí)行完,這不是所期望的結(jié)果。有沒辦法將子進程執(zhí)行完后才讓父進程結(jié)束呢?

這里引入p.join()方法,它使子進程執(zhí)行結(jié)束后,父進程才執(zhí)行之后的代碼

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


def run_proc(wTime):
  n = 0
  while n < 3:
    print "subProcess %s run," % os.getpid(), "{0}".format(time.ctime())
    time.sleep(wTime)
    n += 1

if __name__ == "__main__":
  p = Process(target=run_proc, args=(2,))
  p.daemon = True
  p.start()
  p.join()  #加入join方法
  print "Parent process run. subProcess is ", p.pid
  print "Parent process end,{0}".format(time.ctime())

執(zhí)行結(jié)果:

subProcess 32076 run, Mon Mar 27 11:46:07 2017
subProcess 32076 run, Mon Mar 27 11:46:09 2017
subProcess 32076 run, Mon Mar 27 11:46:11 2017
Parent process run. subProcess is 32076
Parent process end,Mon Mar 27 11:46:13 2017

這樣所有的進程就能順利的執(zhí)行了。

將進程定義成類

通過繼承Process類,來自定義進程類,實現(xiàn)run方法。實例p通過調(diào)用p.start()時自動調(diào)用run方法。

如下:

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


class Myprocess(Process):

  def __init__(self, wTime):
    Process.__init__(self)
    self.wTime = wTime

  def run(self):
    n = 0
    while n < 3:
      print "subProcess %s run," % os.getpid(), "{0}".format(time.ctime())
      time.sleep(self.wTime)
      n += 1


if __name__ == "__main__":
  p = Myprocess(2)
  p.daemon = True
  p.start()  #自動調(diào)用run方法
  p.join()
  print "Parent process run. subProcess is ", p.pid
  print "Parent process end,{0}".format(time.ctime())

執(zhí)行結(jié)果和上一個例子相同。

創(chuàng)建多個進程

很多時候系統(tǒng)都需要創(chuàng)建多個進程以提高CPU的利用率,當數(shù)量較少時,可以手動生成一個個Process實例。當進程數(shù)量很多時,或許可以利用循環(huán),但是這需要程序員手動管理系統(tǒng)中并發(fā)進程的數(shù)量,有時會很麻煩。這時進程池Pool就可以發(fā)揮其功效了??梢酝ㄟ^傳遞參數(shù)限制并發(fā)進程的數(shù)量,默認值為CPU的核數(shù)。

直接上例子:

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

def run_proc(name):    ##定義一個函數(shù)用于進程調(diào)用
  for i in range(5):  
    time.sleep(0.2)  #休眠0.2秒
    print 'Run child process %s (%s)' % (name, os.getpid())
#執(zhí)行一次該函數(shù)共需1秒的時間

if __name__ =='__main__': #執(zhí)行主進程
  print 'Run the main process (%s).' % (os.getpid())
  mainStart = time.time() #記錄主進程開始的時間
  p = Pool(8)      #開辟進程池
  for i in range(16):                 #開辟14個進程
    p.apply_async(run_proc,args=('Process'+str(i),))#每個進程都調(diào)用run_proc函數(shù),
                            #args表示給該函數(shù)傳遞的參數(shù)。

  print 'Waiting for all subprocesses done ...'
  p.close() #關(guān)閉進程池
  p.join() #等待開辟的所有進程執(zhí)行完后,主進程才繼續(xù)往下執(zhí)行
  print 'All subprocesses done'
  mainEnd = time.time() #記錄主進程結(jié)束時間
  print 'All process ran %0.2f seconds.' % (mainEnd-mainStart) #主進程執(zhí)行時間

執(zhí)行結(jié)果:

開頭部分

Run the main process (30920).
Waiting for all subprocesses done …
Run child process Process0 (32396)
Run child process Process3 (25392)
Run child process Process1 (28732)
Run child process Process2 (32436)

末尾部分:

Run child process Process15 (25880)
All subprocesses done
All process last 2.49 seconds.

相關(guān)說明:

這里進程池對并發(fā)進程的限制數(shù)量為8個,而程序運行時會產(chǎn)生16個進程,進程池將自動管理系統(tǒng)內(nèi)進程的并發(fā)數(shù)量,其余進程將會在隊列中等待。限制并發(fā)數(shù)量是因為,系統(tǒng)中并發(fā)的進程不是越多越好,并發(fā)進程太多,可能使CPU大部分的時間用于進程調(diào)度,而不是執(zhí)行有效的計算。

采用多進程并發(fā)技術(shù)時,就單個處理機而言,其對進程的執(zhí)行是串行的。但具體某個時刻哪個進程獲得CPU資源而執(zhí)行是不可預(yù)知的(如執(zhí)行結(jié)果的開頭部分,各進程的執(zhí)行順序不定),這就體現(xiàn)了進程的異步性。

如果單個程序執(zhí)行14次run_proc函數(shù),那么它會需要至少16秒,通過進程的并發(fā),這里只需要2.49秒,可見并發(fā)的優(yōu)勢。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • python Dataframe字符串合并的操作方法

    python Dataframe字符串合并的操作方法

    Dataframe的字符串合并包括2種場景,1.合并df中其中幾列字符串;2.將df中的字符串與外部字符串合并,本文主要介紹在Python下對Dataframe進行字符串合并操作的方法,感興趣的朋友跟隨小編一起看看吧
    2024-06-06
  • Python 中如何使用 setLevel() 設(shè)置日志級別

    Python 中如何使用 setLevel() 設(shè)置日志級別

    這篇文章主要介紹了在 Python 中使用setLevel() 設(shè)置日志級別,Python 提供了一個單獨的日志記錄模塊作為其標準庫的一部分,以簡化日志記錄,本文將討論日志記錄 setLevel 及其在 Python 中的工作方式,需要的朋友可以參考下
    2023-07-07
  • 通過實例簡單了解Python sys.argv[]使用方法

    通過實例簡單了解Python sys.argv[]使用方法

    這篇文章主要介紹了通過實例簡單了解Python sys.argv[]使用方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08
  • Python用于學(xué)習(xí)重要算法的模塊pygorithm實例淺析

    Python用于學(xué)習(xí)重要算法的模塊pygorithm實例淺析

    這篇文章主要介紹了Python用于學(xué)習(xí)重要算法的模塊pygorithm,結(jié)合實例形式簡單分析了pygorithm模塊的功能、算法調(diào)用、源碼獲取、時間復(fù)雜度計算等相關(guān)操作技巧,需要的朋友可以參考下
    2018-08-08
  • python中利用隊列asyncio.Queue進行通訊詳解

    python中利用隊列asyncio.Queue進行通訊詳解

    asyncio是Python 3.4版本引入的標準庫,直接內(nèi)置了對異步IO的支持。 下面這篇文章主要給大家介紹了關(guān)于python中利用隊列asyncio.Queue進行通訊的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下。
    2017-09-09
  • Python列表刪除所有出現(xiàn)元素的兩種方法

    Python列表刪除所有出現(xiàn)元素的兩種方法

    今天寫代碼的時候遇到一個小問題,Python中要刪除列表中的所有元素,本文主要介紹了Python列表刪除所有出現(xiàn)元素的兩種方法,非常具有實用價值,需要的朋友可以參考下
    2023-06-06
  • Pytorch自定義Dataset和DataLoader去除不存在和空數(shù)據(jù)的操作

    Pytorch自定義Dataset和DataLoader去除不存在和空數(shù)據(jù)的操作

    這篇文章主要介紹了Pytorch自定義Dataset和DataLoader去除不存在和空數(shù)據(jù)的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • python使用wxpy輕松實現(xiàn)微信防撤回的方法

    python使用wxpy輕松實現(xiàn)微信防撤回的方法

    今天小編就為大家分享一篇python使用wxpy輕松實現(xiàn)微信防撤回的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-02-02
  • Python實現(xiàn)PS濾鏡Fish lens圖像扭曲效果示例

    Python實現(xiàn)PS濾鏡Fish lens圖像扭曲效果示例

    這篇文章主要介紹了Python實現(xiàn)PS濾鏡Fish lens圖像扭曲效果,結(jié)合實例形式分析了Python實現(xiàn)PS濾鏡的圖像扭曲效果相關(guān)操作技巧,需要的朋友可以參考下
    2018-01-01
  • 如何設(shè)置PyCharm中的Python代碼模版(推薦)

    如何設(shè)置PyCharm中的Python代碼模版(推薦)

    這篇文章主要介紹了如何設(shè)置PyCharm中的Python代碼模版,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11

最新評論