簡體   English   中英

Python Windows 和 Linux 之間的多進程差異

[英]Python Multiprocess diff between Windows and Linux

我有一個名為 jobrunner.py 的腳本,它在 main.py 中調用 class 方法。 見下文...

# 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()

在 OSX 和 Ubuntu 上調用進程 _a 和 _b 沒有任何問題,但是當我嘗試在 Windows 上運行相同的東西時(相同版本的 Z23EEEB4347BDD26BFC6B7EEE 超出范圍並且全部失敗)。 這讓我相信在 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()

您不應該期望您在父進程中設置的全局變量的值會自動傳播到子進程。

您的代碼恰好可以在類 Unix 平台上運行,因為在這些平台上, multiprocessing使用fork() 這意味着每個子進程都會獲得父進程地址空間的副本,包括所有全局變量。

Windows 不是這種情況; 父進程中需要被子進程訪問的每個變量都必須顯式向下傳遞或放置在共享 memory 中

完成此操作后,您的代碼將在 Unix 和 Windows 上運行。

暫無
暫無

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

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