成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

python學(xué)習(xí)筆記 - 對(duì)進(jìn)程的管理 Lock、Semaphore、Event

Ilikewhite / 2191人閱讀

摘要:前面的文章介紹了如何進(jìn)行進(jìn)程間的通信方式。結(jié)下來我們來講一講如何管理多個(gè)進(jìn)程對(duì)資源的訪問。正確的情況是,在一個(gè)進(jìn)程寫完的時(shí)候,再讓另一個(gè)進(jìn)程進(jìn)行寫入。那么后的代碼塊都是被所保護(hù)。懷疑會(huì)在下出錯(cuò)以上代碼可以正確執(zhí)行。

前面的文章介紹了如何進(jìn)行進(jìn)程間的通信方式。結(jié)下來我們來講一講如何管理多個(gè)進(jìn)程對(duì)資源的訪問。
例如有時(shí)候我們多個(gè)進(jìn)程對(duì)某一個(gè)文件進(jìn)行寫入的時(shí)候,如果我們一個(gè)進(jìn)程還沒有寫完,就被CPU切換到另一個(gè)進(jìn)程,勢(shì)必會(huì)造成文件寫入的順序亂七八糟的。正確的情況是,在一個(gè)進(jìn)程寫完的時(shí)候,再讓另一個(gè)進(jìn)程進(jìn)行寫入。這時(shí)候,我們需要一個(gè)鎖。

Lock

Lock有一點(diǎn)像我們?nèi)粘I钪猩蠋?。廁所就是我們的資源,可以解決我們的需求。但是廁所是有限的,而且一次只能進(jìn)去一個(gè)人。同時(shí)想上廁所的人很多,還沒輪到的人全部在外邊等待,輪到的人可以進(jìn)去使用廁所,同時(shí)會(huì)鎖上門,禁止其他人進(jìn)入。上完廁所的人出來,打開廁所門,讓后面的人進(jìn)來。
翻譯成計(jì)算機(jī)語言就是:
這個(gè)資源只允許一個(gè)Process訪問,因此只有一個(gè)門,上一把鎖。

from multiprocessing import Lock, Pool
import random


def write_file(lock):
    with lock:
        with open("write_demo.txt", "a") as wf:
            wf.write(str(random.random())+"
")


if __name__ == "__main__":
    lock = Lock()
    pool = Pool()
    for i in range(0, 10):
        pool.apply_async(write_file(lock))
    pool.close()

注意: lock其實(shí)跟文件的打開關(guān)閉一樣,可以使用with語句。

Lock supports the context manager protocol and thus may be used in with statements.

解釋一下這里為什么是with lock:因?yàn)樵?b>if __name__ == "__main__":中我們已經(jīng)創(chuàng)建了Lock對(duì)象。而with后是需要跟一個(gè)對(duì)象,因此直接將lock寫在后面即可。那么with后的代碼塊都是被with所保護(hù)。
如果不用with語句的話,則需要手動(dòng)寫:

lock.acquire()
lock.release()

兩者之間的代碼才是被鎖保護(hù)的。

RLock

RLock是Lock的遞歸版。啥意思呢?
我們知道lock.aquire()是請(qǐng)求鎖,當(dāng)當(dāng)前的鎖事鎖定狀態(tài)的時(shí)候,則lock.aquire()則會(huì)阻塞等待鎖釋放。
因此如果我們寫了兩個(gè)lock.aquire()則會(huì)產(chǎn)生死鎖。第二個(gè)lock.aquire()會(huì)永遠(yuǎn)等待在那里。

使用RLock則不會(huì)有這種情況。RLock一個(gè)門支持多個(gè)鎖,上多少把鎖,就得釋放多少次。

Semaphore

Semaphore有信號(hào)燈的意思。
Semaphore跟Lock類似,但是Semaphore可以允許指定最多多少個(gè)進(jìn)程訪問資源。
就像該資源有多個(gè)門,每個(gè)門一把鎖。一個(gè)進(jìn)程訪問了資源,鎖了門,還有其他門可以使用。但是如果所有門都被使用了,那么就得等待有進(jìn)程出來釋放鎖才可以。

在編寫Sempaphore示例代碼的時(shí)候,遇到了一個(gè)比較奇怪的問題。

from multiprocessing import Semaphore, Pool
import os
import time


def worker_process(s):
    print id(s)
    with s:
        print "Process (%s) run" % os.getpid()
        time.sleep(1)
        print "Process (%s) ended" % os.getpid()


if __name__ == "__main__":
    semaphore = Semaphore(1)
    print id(semaphore)
    pool = Pool(4)
    for i in range(0, 1000):
        pool.apply_async(worker_process, args=(semaphore,))
    pool.close()
    pool.join()
    print "Main Process ended"

如上所示的代碼,傳遞semaphore時(shí)候,worker_process并不會(huì)執(zhí)行。
但是如果將semaphore定義成一個(gè)全局變量,那么則可以在Linux或者unix下執(zhí)行。(懷疑會(huì)在windows下出錯(cuò))

from multiprocessing import Semaphore, Pool
import os
import time

semaphore = Semaphore(1)


def worker_process():
    print id(semaphore)
    with semaphore:
        print "Process (%s) run" % os.getpid()
        time.sleep(1)
        print "Process (%s) ended" % os.getpid()


if __name__ == "__main__":
    print id(semaphore)
    pool = Pool(4)
    for i in range(0, 1000):
        pool.apply_async(worker_process)
    pool.close()
    pool.join()
    print "Main Process ended"

以上代碼可以正確執(zhí)行。
暫時(shí)不知道問題出在哪里?有會(huì)的網(wǎng)友還請(qǐng)指點(diǎn)。

Event

還有Event。Event也是用于進(jìn)程間的通信,那么它跟Queue、Pipe有什么區(qū)別呢?

其實(shí)Python多進(jìn)程還有許多的內(nèi)容。在后續(xù)的文章中介紹。

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

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

相關(guān)文章

  • Python進(jìn)程專題7:托管對(duì)

    摘要:連接帶遠(yuǎn)程管理器對(duì)象,該對(duì)象的地址在構(gòu)造函數(shù)中支出。在當(dāng)前進(jìn)程中運(yùn)行管理器服務(wù)器。啟動(dòng)一個(gè)單的子進(jìn)程,并在該子進(jìn)程中啟動(dòng)管理器服務(wù)器。如果無法序列號(hào)對(duì)象將引發(fā)異常。 上一篇文章:Python進(jìn)程專題6:共享數(shù)據(jù)與同步下一篇文章:Python進(jìn)程專題8:分布集群的消息傳遞 進(jìn)程不支持共享對(duì)象,上面描述的創(chuàng)建共享值和數(shù)組,但都是指定的特殊類型,對(duì)高級(jí)的Python對(duì)象(如:字典、列表、用...

    DevYK 評(píng)論0 收藏0
  • python進(jìn)階筆記【1】--- 多進(jìn)程

    摘要:很簡單,這個(gè)模塊實(shí)現(xiàn)了開辟一塊共享內(nèi)存空間,就好比中的方法一樣,有興趣的同學(xué)可以去查閱。查了下資料,返回的對(duì)象控制了一個(gè)進(jìn)程,可用于多進(jìn)程之間的安全通信,其支持的類型有和等。 有關(guān)于 multiprocessing 中共享變量的問題 現(xiàn)在的cpu都很強(qiáng)大,比方我用的至強(qiáng)2620有24核可以同時(shí)工作,并行執(zhí)行進(jìn)程程序。這在計(jì)算密集型的程序是很需要的,如沙漠中的綠洲,令人重獲新生。那么,問...

    Wildcard 評(píng)論0 收藏0
  • Python進(jìn)程專題6:共享數(shù)據(jù)與同步

    摘要:可以使用標(biāo)準(zhǔn)的索引切片迭代操作訪問它,其中每項(xiàng)操作均鎖進(jìn)程同步,對(duì)于字節(jié)字符串,還具有屬性,可以把整個(gè)數(shù)組當(dāng)做一個(gè)字符串進(jìn)行訪問。當(dāng)所編寫的程序必須一次性操作大量的數(shù)組項(xiàng)時(shí),如果同時(shí)使用這種數(shù)據(jù)類型和用于同步的單獨(dú)大的鎖,性能將極大提升。 上一篇文章:Python進(jìn)程專題5:進(jìn)程間通信下一篇文章:Python進(jìn)程專題7:托管對(duì)象 我們現(xiàn)在知道,進(jìn)程之間彼此是孤立的,唯一通信的方式是隊(duì)...

    Yuanf 評(píng)論0 收藏0
  • python---線程

    摘要:某進(jìn)程內(nèi)的線程在其它進(jìn)程不可見。線程的實(shí)體包括程序數(shù)據(jù)和。包括以下信息線程狀態(tài)。當(dāng)線程不運(yùn)行時(shí),被保存的現(xiàn)場(chǎng)資源。用戶級(jí)線程執(zhí)行系統(tǒng)調(diào)用指令時(shí)將導(dǎo)致其所屬進(jìn)程被中斷,而內(nèi)核支持線程執(zhí)行系統(tǒng)調(diào)用指令時(shí),只導(dǎo)致該線程被中斷。線程能夠利用的表空 操作系統(tǒng)線程理論 線程概念的引入背景 進(jìn)程之前我們已經(jīng)了解了操作系統(tǒng)中進(jìn)程的概念,程序并不能單獨(dú)運(yùn)行,只有將程序裝載到內(nèi)存中,系統(tǒng)為它分配資源才能運(yùn)...

    Yangyang 評(píng)論0 收藏0
  • SICP Python 描述 第四章 分布式和并行計(jì)算

    摘要:第四章分布式和并行計(jì)算來源譯者飛龍協(xié)議引言目前為止,我們專注于如何創(chuàng)建解釋和執(zhí)行程序。一個(gè)交互的例子就是在線閱讀紐約時(shí)報(bào)。當(dāng)上的服務(wù)器與瀏覽器客戶端比如通信時(shí),它的任務(wù)就是發(fā)送回來紐約時(shí)報(bào)主頁的。消息有三個(gè)必要部分發(fā)送者接收者和內(nèi)容。 第四章 分布式和并行計(jì)算 來源:Chapter 4: Distributed and Parallel Computing 譯者:飛龍 協(xié)議:CC B...

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

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

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<