第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

Python在進(jìn)程之間共享鎖

Python在進(jìn)程之間共享鎖

不負(fù)相思意 2019-12-21 11:20:45
我正在嘗試使用部分函數(shù),以便pool.map()可以定位具有多個(gè)參數(shù)(在本例中為L(zhǎng)ock()對(duì)象)的函數(shù)。這是示例代碼(摘自我先前的問(wèn)題的答案):from functools import partialdef target(lock, iterable_item):    for item in items:        # Do cool stuff        if (... some condition here ...):            lock.acquire()            # Write to stdout or logfile, etc.            lock.release()def main():    iterable = [1, 2, 3, 4, 5]    pool = multiprocessing.Pool()    l = multiprocessing.Lock()    func = partial(target, l)    pool.map(func, iterable)    pool.close()    pool.join()但是,當(dāng)我運(yùn)行此代碼時(shí),出現(xiàn)錯(cuò)誤:Runtime Error: Lock objects should only be shared between processes through inheritance.我在這里想念什么?如何在子流程之間共享鎖?
查看完整描述

3 回答

?
紫衣仙女

TA貢獻(xiàn)1839條經(jīng)驗(yàn) 獲得超15個(gè)贊

抱歉,我應(yīng)該已經(jīng)回答您其他問(wèn)題了。您不能將普通multiprocessing.Lock對(duì)象傳遞給Pool方法,因?yàn)樗鼈儾荒鼙浑缰?。有兩種方法可以解決此問(wèn)題。一種是創(chuàng)建Manager()并傳遞一個(gè)Manager.Lock():


def main():

    iterable = [1, 2, 3, 4, 5]

    pool = multiprocessing.Pool()

    m = multiprocessing.Manager()

    l = m.Lock()

    func = partial(target, l)

    pool.map(func, iterable)

    pool.close()

    pool.join()

不過(guò),這有點(diǎn)重量級(jí);使用Manager需要產(chǎn)生另一個(gè)進(jìn)程來(lái)托管Manager服務(wù)器。并且所有對(duì)acquire/ release鎖的調(diào)用都必須通過(guò)IPC發(fā)送到該服務(wù)器。


另一個(gè)選擇是multiprocessing.Lock()使用initializerkwarg 在創(chuàng)建池時(shí)傳遞常規(guī)值。這將使您的鎖實(shí)例在所有子工作者中都是全局的:


def target(iterable_item):

    for item in items:

        # Do cool stuff

        if (... some condition here ...):

            lock.acquire()

            # Write to stdout or logfile, etc.

            lock.release()

def init(l):

    global lock

    lock = l


def main():

    iterable = [1, 2, 3, 4, 5]

    l = multiprocessing.Lock()

    pool = multiprocessing.Pool(initializer=init, initargs=(l,))

    pool.map(target, iterable)

    pool.close()

    pool.join()

第二種解決方案具有不再需要的副作用partial。


查看完整回答
反對(duì) 回復(fù) 2019-12-21
?
鳳凰求蠱

TA貢獻(xiàn)1825條經(jīng)驗(yàn) 獲得超4個(gè)贊

multiprocessing.Lock是一個(gè)進(jìn)程安全的對(duì)象,因此您可以將其直接傳遞給子進(jìn)程,并在所有子進(jìn)程中安全地使用它。但是,大多數(shù)可變的Python對(duì)象(例如list,,dict大多數(shù)用戶創(chuàng)建的類)都不安全,因此在進(jìn)程之間傳遞它們會(huì)導(dǎo)致在每個(gè)進(jìn)程中創(chuàng)建對(duì)象的完全不同的副本。在這種情況下,您需要使用multiprocessing.Manager。

查看完整回答
反對(duì) 回復(fù) 2019-12-21
  • 3 回答
  • 0 關(guān)注
  • 826 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)