2011-07-06 65 views
6

我有一個名爲jobrunner.py的腳本,它調用main.py中的類方法。見下文......Windows和Linux之間的Python多進程比較

# jobrunner.py 
from multiprocessing import Process 
import main 
from main import BBOX 

def _a(arg): 
    f = main.a() 
    print f.run() 

def _b(arg): 
    p = main.b() 
    print p.run() 

if __name__ == '__main__': 
    world = '-180,180,-90,90' 
    BBOX.append(world.split(',')) 

    p1 = Process(target=_a, args=("1",)) 
    p2 = Process(target=_b, args=("1",)) 

    p1.start() 
    p2.start() 

    p1.join() 
    p2.join() 

過程_a和_B都沒有在OSX和Ubuntu,但是當我試圖在Windows上運行同樣的事情(同一版本的Python和所有),它沒有說任何指標調用問題超出範圍。這導致我相信在Windows平臺上模塊之間沒有設置或傳遞「全局」變量BBOX。有沒有其他人看過這樣的東西,並知道如何解決它?

亞當

更新:我想通了,即使它可能是一個總的黑客...見下文!

# jobrunner.py 
from multiprocessing import Process 
import main 
from main import BBOX 

def _a(arg): 
    BBOX.append(arg) #This is the key 
    f = main.a() 
    print f.run() 

def _b(arg): 
    BBOX.append(arg) #This is the key 
    p = main.b() 
    print p.run() 

if __name__ == '__main__': 
    world = '-180,180,-90,90' 
    BBOX.append(world.split(',')) 

    p1 = Process(target=_a, args=(BBOX[0],)) 
    p2 = Process(target=_b, args=(BBOX[0],)) 

    p1.start() 
    p2.start() 

    p1.join() 
    p2.join() 

回答

12

你不應該指望你在父進程設置爲自動傳播到子進程的全局變量的值。

你的代碼是因爲這些平臺multiprocessing使用fork()上的類Unix平臺上工作。這意味着每個子進程都會獲得父進程地址空間的副本,包括所有全局變量。

這不是Windows上的情況;需要由孩子訪問的父進程中的每個變量必須明確地爲passed down or placed in shared memory

一旦你這樣做了,你的代碼就可以在Unix和Windows上運行。

+0

謝謝,這真的讓我朝着正確的方向前進,但是,我需要將一個列表傳遞給共享內存。在這種情況下,它會是這樣的列表:[['57','78','23','40']],我將其設置爲BBOX。有一個列表沒有c_type嗎? – aeupinhere