簡體   English   中英

多處理流程中的共享狀態

[英]Shared state in multiprocessing Processes

請考慮以下代碼:

import time
from multiprocessing import Process

class Host(object):
    def __init__(self):
        self.id = None
    def callback(self):
        print "self.id = %s" % self.id
    def bind(self, event_source):
        event_source.callback = self.callback

class Event(object):
    def __init__(self):
        self.callback = None
    def trigger(self):
        self.callback()

h = Host()
h.id = "A"
e = Event()
h.bind(e)
e.trigger()

def delayed_trigger(f, delay):
    time.sleep(delay)
    f()

p = Process(target = delayed_trigger, args = (e.trigger, 3,))
p.start()

h.id = "B"
e.trigger()

這給出了輸出

self.id = A
self.id = B
self.id = A

但是,我希望它能給

self.id = A
self.id = B
self.id = B

..因為在調用觸發方法時h.id已更改為“ B”。

似乎是在啟動單獨的進程時創建了主機實例的副本,因此原始主機中的更改不會影響該副本。

在我的項目中(當然,要進行更詳細的說明),主機實例字段有時會更改,並且由在單獨的進程中運行的代碼觸發的事件可以訪問這些更改很重要。

多處理在不同的進程中運行東西。 事物在發送時不被復制幾乎是不可想象的,因為在進程之間共享內容需要共享內存或通信。

實際上,如果您仔細閱讀該模塊,則可以看到通過分叉通信或通過顯式共享的對象 (屬於顯式對象的非常有限的子集),在分歧之后的進程之間實際共享任何東西所需的工作量。語言,並且必須由Manager )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM