亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

python多進(jìn)程控制學(xué)習(xí)

EdwardUp / 1965人閱讀

摘要:另外,返回的兩個(gè)如果一個(gè)是數(shù)據(jù)那么另外一個(gè)就只能接收數(shù)據(jù)了已經(jīng)執(zhí)行到子進(jìn)程等待所有子進(jìn)程跑完下面打印向傳輸?shù)男畔⑤敵鰹槿谶M(jìn)行并發(fā)編程時(shí),應(yīng)盡量避免使用共享狀態(tài),因?yàn)槎噙M(jìn)程同時(shí)修改數(shù)據(jù)會(huì)導(dǎo)致數(shù)據(jù)破壞。

前言:

python多進(jìn)程,經(jīng)常在使用,卻沒有怎么系統(tǒng)的學(xué)習(xí)過,官網(wǎng)上面講得比較細(xì),結(jié)合自己的學(xué)習(xí),整理記錄下
官網(wǎng):https://docs.python.org/3/library/multiprocessing.html
multiprocessing簡(jiǎn)介

multiprocessing是python自帶的多進(jìn)程模塊,可以大批量的生成進(jìn)程,在服務(wù)器為多核CPU時(shí)效果更好,類似于threading模塊。相對(duì)于多線程,多進(jìn)程由于獨(dú)享內(nèi)存空間,更穩(wěn)定安全,在運(yùn)維里面做些批量操作時(shí),多進(jìn)程有更多適用的場(chǎng)景

multiprocessing包提供了本地和遠(yuǎn)程兩種并發(fā)操作,有效的避開了使用子進(jìn)程而不是全局解釋鎖的線程,因此,multiprocessing可以有效利用到多核處理

Process類

在multiporcessing中,通過Process類對(duì)象來(lái)批量產(chǎn)生進(jìn)程,使用start()方法來(lái)啟動(dòng)這個(gè)進(jìn)程

1.語(yǔ)法
multiprocessing.Process(group=None,target=None,name=None,args=(),kwargs={},*)

group: 這個(gè)參數(shù)一般為空,它只是為了兼容threading.Tread
target: 這個(gè)參數(shù)就是通過run()可調(diào)用對(duì)象的方法,默認(rèn)為空,表示沒有方法被調(diào)用
name: 表示進(jìn)程名
args: 傳給target調(diào)用方法的tuple(元組)參數(shù)
kwargs: 傳給target調(diào)用方法的dict(字典)參數(shù)

2.Process類的方法及對(duì)象

run()
該方法是進(jìn)程的運(yùn)行過程,可以在子類中重寫此方法,一般也很少去重構(gòu)

start()
啟動(dòng)進(jìn)程,每個(gè)進(jìn)程對(duì)象都必須被該方法調(diào)用

join([timeout])
等待進(jìn)程終止,再往下執(zhí)行,可以設(shè)置超時(shí)時(shí)間

name
可以獲取進(jìn)程名字,多個(gè)進(jìn)程也可以是相同的名字

is_alive()
返回進(jìn)程是否還存活,True or False,進(jìn)程存活是指start()開始到子進(jìn)程終止

daemon
守護(hù)進(jìn)程的標(biāo)記,一個(gè)布爾值,在start()之后設(shè)置該值,表示是否后臺(tái)運(yùn)行
注意:如果設(shè)置了后臺(tái)運(yùn)行,那么后臺(tái)程序不運(yùn)行再創(chuàng)建子進(jìn)程

pid
可以獲取進(jìn)程ID

exitcode
子進(jìn)程退出時(shí)的值,如果進(jìn)程還沒有終止,值將是None,如果是負(fù)值,表示子進(jìn)程被終止

terminate()
終止進(jìn)程,如果是Windows,則使用terminateprocess(),該方法對(duì)已經(jīng)退出和結(jié)束的進(jìn)程,將不會(huì)執(zhí)行

以下為一個(gè)簡(jiǎn)單的例子:

#-*- coding:utf8 -*- 
import multiprocessing
import time

def work(x):
   time.sleep(1)
   print time.ctime(),"這是子進(jìn)程[{0}]...".format(x)

if __name__ == "__main__":
    for i in range(5):
        p = multiprocessing.Process(target=work,args=(i,))
        print "啟動(dòng)進(jìn)程數(shù):{0}".format(i)
        p.start()
        p.deamon = True

當(dāng)然也可以顯示每個(gè)進(jìn)程的ID

#-*- coding:utf8 -*- 
import multiprocessing
import time
import os

def work(x):
   time.sleep(1)
   ppid = os.getppid()
   pid  = os.getpid()
   print time.ctime(),"這是子進(jìn)程[{0},父進(jìn)程:{1},子進(jìn)程:{2}]...".format(x,ppid,pid)

if __name__ == "__main__":
    for i in range(5):
        p = multiprocessing.Process(target=work,args=(i,))
        print "啟動(dòng)進(jìn)程數(shù):{0}".format(i)
        p.start()
        p.deamon = True

但在實(shí)際使用的過程中,并不只是并發(fā)完就可以了,比如,有30個(gè)任務(wù),由于服務(wù)器資源有限,每次并發(fā)5個(gè)任務(wù),這里還涉及到30個(gè)任務(wù)怎么獲取的問題,另外并發(fā)的進(jìn)程任務(wù)執(zhí)行時(shí)間很難保證一致,尤其是需要時(shí)間的任務(wù),可能并發(fā)5個(gè)任務(wù),有3個(gè)已經(jīng)執(zhí)行完了,2個(gè)還需要很長(zhǎng)時(shí)間執(zhí)行,總不能等到這兩個(gè)進(jìn)程執(zhí)行完了,再繼續(xù)執(zhí)行后面的任務(wù),因此進(jìn)程控制就在此有了使用場(chǎng)景,可以利用Process的方法和一些multiprocessing的包,類等結(jié)合使用

進(jìn)程控制及通信常用類 一、Queue類

類似于python自帶的Queue.Queue,主要用在比較小的隊(duì)列上面
語(yǔ)法:

multiprocessing.Queue([maxsize])

類方法:
qsize()
返回隊(duì)列的大致大小,因?yàn)槎噙M(jìn)程或者多線程一直在消耗隊(duì)列,因此該數(shù)據(jù)不一定正確

empty()
判斷隊(duì)列是否為空,如果是,則返回True,否則False

full()
判斷隊(duì)列是否已滿,如果是,則返回True,否則False

put(obj[, block[, timeout]])
將對(duì)象放入隊(duì)列,可選參數(shù)block為True,timeout為None

get()
從隊(duì)列取出對(duì)象

#-*- coding:utf8 -*-
from multiprocessing import Process, Queue

def f(q):
    q.put([42,None,"hi"])

if __name__ == "__main__":
    q = Queue()
    p = Process(target=f, args=(q,))
    p.start()
    print q.get()  #打印內(nèi)容: [42,None,"hi"]
    p.join()
二、Pipe類

pipe()函數(shù)返回一對(duì)對(duì)象的連接,可以為進(jìn)程間傳輸消息,在打印一些日志、進(jìn)程控制上面有一些用處,Pip()對(duì)象返回兩個(gè)對(duì)象connection,代表兩個(gè)通道,每個(gè)connection對(duì)象都有send()和recv()方法,需要注意的是兩個(gè)或以上的進(jìn)程同時(shí)讀取或者寫入同一管道,可能會(huì)導(dǎo)致數(shù)據(jù)混亂,測(cè)試了下,是直接覆蓋了。另外,返回的兩個(gè)connection,如果一個(gè)是send()數(shù)據(jù),那么另外一個(gè)就只能recv()接收數(shù)據(jù)了

#-*- coding:utf8 -*-
from multiprocessing import Process, Pipe
import time
def f(conn,i):
    print "[{0}]已經(jīng)執(zhí)行到子進(jìn)程:{1}".format(time.ctime(),i)
    time.sleep(1)
    w = "[{0}]hi,this is :{1}".format(time.ctime(),i)
    conn.send(w)
    conn.close()

if __name__ == "__main__":
    reader = []
    parent_conn, child_conn = Pipe()
    for i in range(4):
        p = Process(target=f, args=(child_conn,i))
        p.start()
        reader.append(parent_conn)
        p.deamon=True

    # 等待所有子進(jìn)程跑完
    time.sleep(3)
    print "
[{0}]下面打印child_conn向parent_conn傳輸?shù)男畔?".format(time.ctime())
    for i in reader:
        print i.recv()

輸出為:

三、Value,Array

在進(jìn)行并發(fā)編程時(shí),應(yīng)盡量避免使用共享狀態(tài),因?yàn)槎噙M(jìn)程同時(shí)修改數(shù)據(jù)會(huì)導(dǎo)致數(shù)據(jù)破壞。但如果確實(shí)需要在多進(jìn)程間共享數(shù)據(jù),multiprocessing也提供了方法Value、Array

from multiprocessing import Process, Value, Array

def f(n, a):
    n.value = 3.1415927
    for i in range(len(a)):
        a[i] = -a[i]

if __name__ == "__main__":
    num = Value("d",0.0)
    arr = Array("i", range(10))

    p = Process(target=f, args=(num, arr))
    p.start()
    p.join()

    print num.value
    print arr[:]

*print
3.1415927
[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]*

四、Manager進(jìn)程管理模塊

Manager類管理進(jìn)程使用得較多,它返回對(duì)象可以操控子進(jìn)程,并且支持很多類型的操作,如: list, dict, Namespace、lock, RLock, Semaphore, BoundedSemaphore, Condition, Event, Barrier, Queue, Value, Array,因此使用Manager基本上就夠了

from multiprocessing import Process, Manager

def f(d, l):
    d[1] = "1"
    d["2"] = 2
    d[0.25] = None
    l.reverse()

if __name__ == "__main__":
    with Manager() as manager:
        d = manager.dict()
        l = manager.list(range(10))

        p = Process(target=f, args=(d, l))
        p.start()
        p.join() #等待進(jìn)程結(jié)束后往下執(zhí)行
        print d,"
",l

輸出:
{0.25: None, 1: "1", "2": 2}
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
可以看到,跟共享數(shù)據(jù)一樣的效果,大部分管理進(jìn)程的方法都集成到了Manager()模塊了

五、對(duì)多進(jìn)程控制的應(yīng)用實(shí)例
    #-*- coding:utf8 -*-
    from multiprocessing import Process, Queue
    import time
    
    def work(pname,q):
        time.sleep(1)
        print_some = "{0}|this is process: {1}".format(time.ctime(),pname)
        print print_some
        q.put(pname)
    
    if __name__ == "__main__":
        p_manag_num = 2  # 進(jìn)程并發(fā)控制數(shù)量2
        # 并發(fā)的進(jìn)程名
        q_process = ["process_1","process_2","process_3","process_4","process_5"]
        q_a = Queue() # 將進(jìn)程名放入隊(duì)列
        q_b = Queue() # 將q_a的進(jìn)程名放往q_b進(jìn)程,由子進(jìn)程完成
    
        for i in q_process:
            q_a.put(i)
    
        p_list = [] # 完成的進(jìn)程隊(duì)列
        while not q_a.empty():
            if len(p_list) <= 2:
                pname=q_a.get()
                p = Process(target=work, args=(pname,q_b))
                p.start()
                p_list.append(p)
                print pname
    
            for p in p_list:
                if not p.is_alive():
                    p_list.remove(p)
    
        # 等待5秒,預(yù)估執(zhí)行完后看隊(duì)列通信信息
        # 當(dāng)然也可以循環(huán)判斷隊(duì)列里面的進(jìn)程是否執(zhí)行完成
        time.sleep(5)
        print "打印p_b隊(duì)列:"
        while not q_b.empty():
            print q_b.get()

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

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/44890.html

相關(guān)文章

  • 實(shí)戰(zhàn)案例分享:利用Python實(shí)現(xiàn)多任務(wù)進(jìn)

    摘要:效率高當(dāng)然,對(duì)于爬蟲這種密集型任務(wù)來(lái)說(shuō),多線程和多進(jìn)程影響差別并不大。對(duì)于計(jì)算密集型任務(wù)來(lái)說(shuō),的多進(jìn)程相比多線程,其多核運(yùn)行效率會(huì)有成倍的提升。 一、進(jìn)程介紹 進(jìn)程...

    MudOnTire 評(píng)論0 收藏0
  • Python中的協(xié)

    摘要:協(xié)程的基本行為協(xié)程包含四種狀態(tài)等待開始執(zhí)行。協(xié)程中重要的兩個(gè)方法調(diào)用方把數(shù)據(jù)提供給協(xié)程。注意使用調(diào)用協(xié)程時(shí)會(huì)自動(dòng)預(yù)激,因此與裝飾器不兼容標(biāo)準(zhǔn)庫(kù)中的裝飾器不會(huì)預(yù)激協(xié)程,因此能兼容句法。因此,終止協(xié)程的本質(zhì)在于向協(xié)程發(fā)送其無(wú)法處理的異常。 導(dǎo)語(yǔ):本文章記錄了本人在學(xué)習(xí)Python基礎(chǔ)之控制流程篇的重點(diǎn)知識(shí)及個(gè)人心得,打算入門Python的朋友們可以來(lái)一起學(xué)習(xí)并交流。 本文重點(diǎn): 1、掌握協(xié)...

    shinezejian 評(píng)論0 收藏0
  • Python 學(xué)習(xí)筆記 關(guān)于協(xié)

    摘要:協(xié)程定義協(xié)程是指一個(gè)過程,這個(gè)過程與調(diào)用方協(xié)作,產(chǎn)出由調(diào)用方提供的值。當(dāng)?shù)玫娇刂茩?quán)時(shí),會(huì)阻塞,同時(shí)等待終止。終止協(xié)程的方法該方法致使生成器在暫停的表達(dá)式處拋出異常。 協(xié)程 定義:協(xié)程是指一個(gè)過程,這個(gè)過程與調(diào)用方協(xié)作,產(chǎn)出由調(diào)用方提供的值。(協(xié)程中必定含有一條yield語(yǔ)句) 協(xié)程與生成器類似,都是定義體內(nèi)包含yield關(guān)鍵字的函數(shù)。不過,在協(xié)程中,yield通常出現(xiàn)在表達(dá)式的右邊(例...

    VishKozus 評(píng)論0 收藏0
  • Python中的并發(fā)處理之使用asyncio包

    摘要:并發(fā)用于制定方案,用來(lái)解決可能但未必并行的問題。在協(xié)程中使用需要注意兩點(diǎn)使用鏈接的多個(gè)協(xié)程最終必須由不是協(xié)程的調(diào)用方驅(qū)動(dòng),調(diào)用方顯式或隱式在最外層委派生成器上調(diào)用函數(shù)或方法。對(duì)象可以取消取消后會(huì)在協(xié)程當(dāng)前暫停的處拋出異常。 導(dǎo)語(yǔ):本文章記錄了本人在學(xué)習(xí)Python基礎(chǔ)之控制流程篇的重點(diǎn)知識(shí)及個(gè)人心得,打算入門Python的朋友們可以來(lái)一起學(xué)習(xí)并交流。 本文重點(diǎn): 1、了解asyncio...

    tuniutech 評(píng)論0 收藏0
  • Python協(xié)(真才實(shí)學(xué),想學(xué)的進(jìn)來(lái))

    摘要:所以與多線程相比,線程的數(shù)量越多,協(xié)程性能的優(yōu)勢(shì)越明顯。值得一提的是,在此過程中,只有一個(gè)線程在執(zhí)行,因此這與多線程的概念是不一樣的。 真正有知識(shí)的人的成長(zhǎng)過程,就像麥穗的成長(zhǎng)過程:麥穗空的時(shí)候,麥子長(zhǎng)得很快,麥穗驕傲地高高昂起,但是,麥穗成熟飽滿時(shí),它們開始謙虛,垂下麥芒。 ——蒙田《蒙田隨筆全集》 上篇論述了關(guān)于python多線程是否是雞肋的問題,得到了一些網(wǎng)友的認(rèn)可,當(dāng)然也有...

    lykops 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<