2014-01-15 39 views
0

我設計了一個python模塊,我想要在兩個不同的進程中運行2個方法(method1和method2)是否有可以同時讀取和寫入兩個進程的全局列表?或者這會在我的項目中引發問題?2個進程是否可以訪問同一個列表?

下面有一個例子:

from multiprocessing import Process, Queue 
data =[] 

def method1(): 
    global data 
    data += [10,14,5] 

def method2(): 
    global data 
    data = [1,3,4] 
    proc = Process(target=method1) 
    proc.start() 
    print data 

if __name__ == '__main__': 
    method2() 

這必須是跨平臺的,Windows,Linux和OS X,在Python 2.7。

+0

你是否需要這個跨平臺的,並保證安全,或只是對某些特定的Python實現和版本和平臺的安全? (如果是,哪些?) – abarnert

+0

@abarnert請參閱編輯。 – Dean

+0

你已經用'python-multithreading'(其中「通常指代'threading'模塊」)標記了這個標記,但實際上你正在詢問'multiprocessing'。兩者的答案實際上是不同的。 (使用'threading',答案是「你可能不應該想,但如果你真的想,你可以......」;使用'multiprocessing',它是「你絕對不應該想,而且你不能「) – abarnert

回答

1

如果這需要跨平臺,那麼不,你不能共享這樣的列表。 (在Unix上,如果你小心,有時可以,但從不在Windows上。)

如果您在文檔中閱讀了Sharing state between processes,它會解釋您可以共享的內容以及如何操作,但基本上只是簡單的值Array其他可共享的類型,以及任何你可以定義爲ctypes.Structure,就是這樣。

Programming guidelines,特別是Windows部分,解釋了爲什麼這是真實的,以及如何處理它。但基本上,問題在於,在Windows上,新流程並不是舊流程的一個分支,而是一個全新的流程。

有很多選擇。

最好的方法是重新設計您的算法,將不可變值傳遞給子代並讓其返回新的不可變值,而不是改變共享值。

如果您不能走得太遠,通常可以通過傳遞消息來重寫事件,例如QueuePipe。在最壞的情況下,消息可以是(list.append, data, [10, 14, 5]),但通常你可以想出更高層次,更有意義的東西。

1

從幫助文檔: http://docs.python.org/2/library/multiprocessing.html#exchanging-objects-between-processes

from multiprocessing import Process, Queue 

def f(q): 
    q.put([42, None, 'hello']) 

if __name__ == '__main__': 
    q = Queue() 
    p = Process(target=f, args=(q,)) 
    p.start() 
    print q.get() # prints "[42, None, 'hello']" 
    p.join() 

你已經輸入隊列。現在你只需要使用它:)

把添加項目,獲取項目,從隊列中。

+1

但是,在隊列中添加列表只允許在其他進程中檢索該列表一次;我認爲OP想要的是有一個可以同時從兩個進程訪問和修改的列表對象。 – 2014-01-15 22:16:08

+0

是的,我目前正在開發使用隊列,但我想知道如果我可以做到這一點與全球列表。 – Dean

相關問題