最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

通過實例解析python創(chuàng)建進(jìn)程常用方法

 更新時間:2020年06月19日 09:05:54   作者:夏日的向日葵  
這篇文章主要介紹了通過實例解析python創(chuàng)建進(jìn)程常用方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

 運行程序時,單線程或單進(jìn)程往往是比較慢的,為加快程序運行速度,我們可以使用多進(jìn)程,可以理解為多任務(wù)同時運行,小編的電腦是四核,所以可以設(shè)置四個進(jìn)程。

下面,我們來了解下多進(jìn)程的使用:

1、使用multiprocessing模塊創(chuàng)建進(jìn)程

  multiprocessing模塊提供了一個Process類來代表進(jìn)程對象,語法如下:

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

  其中,group:參數(shù)未使用,值始終是None

  target:表示當(dāng)前進(jìn)程啟動時執(zhí)行的可調(diào)用對象

  name:為當(dāng)前進(jìn)程實例的別名

  args:表示傳遞給target函數(shù)的參數(shù)元組

  kwargs:表示傳遞給target函數(shù)的參數(shù)字典

使用多進(jìn)程的一個簡單例子:

from multiprocessing import Process   # 導(dǎo)入模塊

# 執(zhí)行子進(jìn)程代碼
def test(interval):
  print('我是子進(jìn)程')
# 執(zhí)行主程序
def main():
  print('主進(jìn)程開始')
  # 實例化Procss進(jìn)程類
  p = Process(target=test,args=(1,))
  # 啟動子進(jìn)程
  p.start()
  print('主進(jìn)程結(jié)束')

if __name__ == '__main__':
  main()

結(jié)果:

主進(jìn)程開始
主進(jìn)程結(jié)束
我是子進(jìn)程

  Process的實例p常用的方法除start()外,還有如下常用方法:

  is_alive():判斷進(jìn)程實例是否還在執(zhí)行

  join([timeout]):是否等待進(jìn)程實例執(zhí)行結(jié)束,或等待多少秒

  start():啟動進(jìn)程實例(創(chuàng)建子進(jìn)程)

  run():如果沒有給定target參數(shù),對這個對象調(diào)用start()方法時,就將執(zhí)行對象中的run()方法

  terminate():不管任務(wù)是否完成,立即終止

  Process類還有如下常用屬性:

  name:當(dāng)前進(jìn)程實例別名,默認(rèn)為Process-N,N為從1開始遞增的整數(shù)

  pid:當(dāng)前進(jìn)程實例的PID值

下面是Process類方法和屬性的使用,創(chuàng)建兩個子進(jìn)程,分別使用os模塊和time模塊輸出父進(jìn)程和子進(jìn)程的id以及子進(jìn)程的時間,并調(diào)用Process類的name和pid屬性:

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

#兩個子進(jìn)程將會調(diào)用的兩個方法
def child_1(interval):
  print("子進(jìn)程(%s)開始執(zhí)行,父進(jìn)程為(%s)" % (os.getpid(), os.getppid()))
  # 計時開始
  t_start = time.time()
  # 程序?qū)粧炱餴nterval秒
  time.sleep(interval)
  # 計時結(jié)束
  t_end = time.time()
  print("子進(jìn)程(%s)執(zhí)行時間為'%0.2f'秒"%(os.getpid(),t_end - t_start))

def child_2(interval):
  print("子進(jìn)程(%s)開始執(zhí)行,父進(jìn)程為(%s)" % (os.getpid(), os.getppid()))
  # 計時開始
  t_start = time.time()
  # 程序?qū)粧炱餴nterval秒
  time.sleep(interval)
  # 計時結(jié)束
  t_end = time.time()
  print("子進(jìn)程(%s)執(zhí)行時間為'%0.2f'秒"%(os.getpid(),t_end - t_start))

if __name__ == '__main__':
  print("------父進(jìn)程開始執(zhí)行-------")
  # 輸出當(dāng)前程序的ID
  print("父進(jìn)程PID:%s" % os.getpid())
  # 實例化進(jìn)程p1
  p1=Process(target=child_1,args=(1,))
  # 實例化進(jìn)程p2
  p2=Process(target=child_2,name="mrsoft",args=(2,))
  # 啟動進(jìn)程p1
  p1.start()
  # 啟動進(jìn)程p2
  p2.start()
  #同時父進(jìn)程仍然往下執(zhí)行,如果p2進(jìn)程還在執(zhí)行,將會返回True
  print("p1.is_alive=%s"%p1.is_alive())
  print("p2.is_alive=%s"%p2.is_alive())
  #輸出p1和p2進(jìn)程的別名和PID
  print("p1.name=%s"%p1.name)
  print("p1.pid=%s"%p1.pid)
  print("p2.name=%s"%p2.name)
  print("p2.pid=%s"%p2.pid)
  print("------等待子進(jìn)程-------")
  # 等待p1進(jìn)程結(jié)束
  p1.join()
  # 等待p2進(jìn)程結(jié)束
  p2.join()
  print("------父進(jìn)程執(zhí)行結(jié)束-------")

結(jié)果:

------父進(jìn)程開始執(zhí)行-------
父進(jìn)程PID:13808
p1.is_alive=True
p2.is_alive=True
p1.name=Process-1
p1.pid=13360
p2.name=mrsoft
p2.pid=21500
------等待子進(jìn)程-------
子進(jìn)程(13360)開始執(zhí)行,父進(jìn)程為(13808)
子進(jìn)程(21500)開始執(zhí)行,父進(jìn)程為(13808)
子進(jìn)程(13360)執(zhí)行時間為'1.01'秒
子進(jìn)程(21500)執(zhí)行時間為'2.00'秒
------父進(jìn)程執(zhí)行結(jié)束-------

  上述代碼中,第一次實例化Process類時,會為name屬性默認(rèn)賦值為Process-1,第二次則默認(rèn)為Process-2,但由于實例化進(jìn)程p2時,設(shè)置了name屬性為mrsoft,所以p2.name的值為mrsoft。

2、使用Process子類創(chuàng)建進(jìn)程

  對于一些簡單的小任務(wù),通常使用Process(target=test)方式實現(xiàn)多進(jìn)程。但如果要處理復(fù)雜任務(wù)的進(jìn)程,通常定義一個類,使其繼承Process類,下面是通過使用Process子類創(chuàng)建多個進(jìn)程。

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

#繼承Process類
class SubProcess(Process):
  # 由于Process類本身也有__init__初識化方法,這個子類相當(dāng)于重寫了父類的這個方法
  def __init__(self,interval,name=''):
    # 調(diào)用Process父類的初始化方法
    Process.__init__(self)
    # 接收參數(shù)interval
    self.interval = interval
    # 判斷傳遞的參數(shù)name是否存在
    if name:
      # 如果傳遞參數(shù)name,則為子進(jìn)程創(chuàng)建name屬性,否則使用默認(rèn)屬性
      self.name = name    
  #重寫了Process類的run()方法
  def run(self):
    print("子進(jìn)程(%s) 開始執(zhí)行,父進(jìn)程為(%s)"%(os.getpid(),os.getppid()))
    t_start = time.time()
    time.sleep(self.interval)
    t_stop = time.time()
    print("子進(jìn)程(%s)執(zhí)行結(jié)束,耗時%0.2f秒"%(os.getpid(),t_stop-t_start))

if __name__=="__main__":
  print("------父進(jìn)程開始執(zhí)行-------")
  # 輸出當(dāng)前程序的ID
  print("父進(jìn)程PID:%s" % os.getpid())         
  p1 = SubProcess(interval=1,name='mrsoft')
  p2 = SubProcess(interval=2)
  #對一個不包含target屬性的Process類執(zhí)行start()方法,就會運行這個類中的run()方法,
  #所以這里會執(zhí)行p1.run()
  # 啟動進(jìn)程p1
  p1.start()
  # 啟動進(jìn)程p2
  p2.start() 
  # 輸出p1和p2進(jìn)程的執(zhí)行狀態(tài),如果真正進(jìn)行,返回True,否則返回False
  print("p1.is_alive=%s"%p1.is_alive())
  print("p2.is_alive=%s"%p2.is_alive())
  #輸出p1和p2進(jìn)程的別名和PID
  print("p1.name=%s"%p1.name)
  print("p1.pid=%s"%p1.pid)
  print("p2.name=%s"%p2.name)
  print("p2.pid=%s"%p2.pid)
  print("------等待子進(jìn)程-------")
  # 等待p1進(jìn)程結(jié)束
  p1.join()
  # 等待p2進(jìn)程結(jié)束
  p2.join() 
  print("------父進(jìn)程執(zhí)行結(jié)束-------")

結(jié)果:

------父進(jìn)程開始執(zhí)行-------
父進(jìn)程PID:2512
p1.is_alive=True
p2.is_alive=True
p1.name=mrsoft
p1.pid=20328
p2.name=SubProcess-2
p2.pid=13700
------等待子進(jìn)程-------
子進(jìn)程(20328) 開始執(zhí)行,父進(jìn)程為(2512)
子進(jìn)程(13700) 開始執(zhí)行,父進(jìn)程為(2512)
子進(jìn)程(20328)執(zhí)行結(jié)束,耗時1.00秒
子進(jìn)程(13700)執(zhí)行結(jié)束,耗時2.00秒
------父進(jìn)程執(zhí)行結(jié)束-------

  上述代碼中,定義了一個SubProcess子類,繼承multiprocess.Process父類。SubProcess子類中定義了兩個方法:__init__()初始化方法和run()方法,在__init__()初始化方法中,調(diào)用父類multiprocess.Process的__init__()初始化方法,否則父類的__init__()方法會被覆蓋,無法開啟進(jìn)程。此外,在SubProcess子類中沒有定義start()方法,但在主程序中卻調(diào)用了start()方法,此時就會自動執(zhí)行SubProcess類的run()方法。

3、使用進(jìn)程池Pool創(chuàng)建進(jìn)程

  上面我們使用Process類創(chuàng)建了兩個進(jìn)程,但如果要創(chuàng)建十幾個或者上百個進(jìn)程,則需要實例化更多的Process類,解決這一問題的方法就是使用multiprocessing模塊提供的pool類,即Pool進(jìn)程池。

  我們先來了解下Pool類的常用方法:

  apply_async(func[,args[,kwds]]):使用非阻塞方式調(diào)用func()函數(shù)(并行執(zhí)行,阻塞方式必須等待上一個進(jìn)程退出才能執(zhí)行下一個進(jìn)程),args為傳遞給func()函數(shù)的參數(shù)列表, kwds為傳遞給func()函數(shù)的關(guān)鍵字參數(shù)列表

  apply(func[,args[,kwds]]):使用阻塞方式調(diào)用func()函數(shù)

  close():關(guān)閉Pool,使其不再接受新的任務(wù)

  terminate():不管任務(wù)是否完成,立即終止

  join():主進(jìn)程阻塞,等待子進(jìn)程的退出,必須在close或terminate之后使用

  下面通過一個示例演示一下如何通過進(jìn)程池創(chuàng)建多進(jìn)程,設(shè)置最大進(jìn)程數(shù)為3,使用非阻塞方式執(zhí)行10個任務(wù):

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

def task(name):
  print('子進(jìn)程(%s)執(zhí)行task %s ...' % ( os.getpid() ,name))
  # 休眠1秒
  time.sleep(1)    

if __name__=='__main__':
  print('父進(jìn)程(%s).' % os.getpid())
  # 定義一個進(jìn)程池,最大進(jìn)程數(shù)3
  p = Pool(3)    
  # 從0開始循環(huán)10次  
  for i in range(10):
    # 使用非阻塞方式調(diào)用task()函數(shù) 
    p.apply_async(task, args=(i,))  
  print('等待所有子進(jìn)程結(jié)束...')
  # 關(guān)閉進(jìn)程池,關(guān)閉后p不再接收新的請求
  p.close()
  # 等待子進(jìn)程結(jié)束
  p.join()  
  print('所有子進(jìn)程結(jié)束.')

結(jié)果:

父進(jìn)程(3856).
等待所有子進(jìn)程結(jié)束...
子進(jìn)程(18872)執(zhí)行task 0 ...
子進(jìn)程(11220)執(zhí)行task 1 ...
子進(jìn)程(10140)執(zhí)行task 2 ...
子進(jìn)程(18872)執(zhí)行task 3 ...
子進(jìn)程(11220)執(zhí)行task 4 ...
子進(jìn)程(10140)執(zhí)行task 5 ...
子進(jìn)程(18872)執(zhí)行task 6 ...
子進(jìn)程(11220)執(zhí)行task 7 ...
子進(jìn)程(10140)執(zhí)行task 8 ...
子進(jìn)程(18872)執(zhí)行task 9 ...
所有子進(jìn)程結(jié)束.

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

相關(guān)文章

  • python中實現(xiàn)控制小數(shù)點位數(shù)的方法

    python中實現(xiàn)控制小數(shù)點位數(shù)的方法

    今天小編就為大家分享一篇python中實現(xiàn)控制小數(shù)點位數(shù)的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • 使用wxpy實現(xiàn)自動發(fā)送微信消息功能

    使用wxpy實現(xiàn)自動發(fā)送微信消息功能

    這篇文章主要介紹了使用wxpy實現(xiàn)自動發(fā)送微信消息功能,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-02-02
  • pandas將list數(shù)據(jù)拆分成行或列的實現(xiàn)

    pandas將list數(shù)據(jù)拆分成行或列的實現(xiàn)

    這篇文章主要介紹了pandas將list數(shù)據(jù)拆分成行或列的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • selenium+python實現(xiàn)文件上傳操作的方法實例

    selenium+python實現(xiàn)文件上傳操作的方法實例

    文件上傳功能是我們在日常開發(fā)中經(jīng)常會遇到的一個需求,下面這篇文章主要給大家介紹了關(guān)于selenium+python實現(xiàn)文件上傳操作的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-08-08
  • 在python中使用[[v]*n]*n遇到的坑及解決

    在python中使用[[v]*n]*n遇到的坑及解決

    這篇文章主要介紹了在python中使用[[v]*n]*n遇到的坑及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • Python設(shè)計模式中的狀態(tài)模式你了解嗎

    Python設(shè)計模式中的狀態(tài)模式你了解嗎

    這篇文章主要為大家詳細(xì)介紹了Python設(shè)計模式中的狀態(tài)模式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • Python 類與元類的深度挖掘 I【經(jīng)驗】

    Python 類與元類的深度挖掘 I【經(jīng)驗】

    super() 方法解決了類->實例實踐過程中關(guān)于命名空間的一些問題,而關(guān)于生成對象的流程,我們知道初始化實例是通過類的 __init__() 方法完成的,在此之前可能涉及到一些其它的準(zhǔn)備工作,包括接下來提到的 mro() 方法以及關(guān)鍵的元類->類的過程
    2016-05-05
  • Python遞歸遍歷列表及輸出的實現(xiàn)方法

    Python遞歸遍歷列表及輸出的實現(xiàn)方法

    這篇文章主要介紹了Python遞歸遍歷列表及輸出的實現(xiàn)方法,可實現(xiàn)遞歸遍歷列表中的每一項,若是元祖則判斷是否為基本類型然后輸出,需要的朋友可以參考下
    2015-05-05
  • python繪制直方圖和密度圖的實例

    python繪制直方圖和密度圖的實例

    今天小編就為大家分享一篇python繪制直方圖和密度圖的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • Python反爬蟲偽裝瀏覽器進(jìn)行爬蟲

    Python反爬蟲偽裝瀏覽器進(jìn)行爬蟲

    這篇文章主要介紹了Python反爬蟲偽裝瀏覽器進(jìn)行爬蟲,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-02-02

最新評論

泸水县| 庆安县| 余姚市| 尖扎县| 鄱阳县| 威宁| 乌鲁木齐县| 剑川县| 丰宁| 靖远县| 霸州市| 游戏| 弥渡县| 汉寿县| 醴陵市| 兴化市| 博客| 蒙山县| 祁门县| 昂仁县| 陇川县| 台安县| 余庆县| 缙云县| 安宁市| 辽阳市| 通许县| 米泉市| 紫金县| 奇台县| 车致| 吴川市| 平南县| 左贡县| 紫云| 金湖县| 凤凰县| 大渡口区| 云和县| 德兴市| 西林县|