2017-01-06 27 views
0

我想運行一系列命令(需要很長時間)。但我不想等待每個命令的完成。我怎樣才能在Python中解決這個問題?Python創建一個子進程,不要等待

我看着

os.fork() 

subprocess.popen() 

不要以爲這就是我所需要的。

代碼

def command1(): 
    wait(10) 

def command2(): 
    wait(10) 

def command3(): 
    wait(10) 

我想打電話給

command1() 
command2() 
command3() 

無需等待。

+0

如果你使用Python 3.4+,你可以使用[asyncio subprocess](https://docs.python.org/3/library/asyncio-subprocess.html) –

+0

如果你的命令是python函數,你可以考慮線程:https://docs.python.org/2/library/threading.html。這也取決於你的意思是「我不想等待」 – doomyster

+1

嗯......只是刪除「等待」......對不起。 :)你有沒有看過'multiprocessing'?您可以爲每個命令啓動一個進程。默認文檔很好地解釋了這一點。 –

回答

2

的最直接方式是使用Python的multiprocessing

from multiprocessing import Process 

def command1(): 
    wait(10) 
... 

call1 = Process(target=command1, args=(...)) 
call1.start() 
... 

這個模塊被引入回正好以緩解控制在相同的代碼庫。當然使用的功能的外部流程執行的負擔,即已經可以通過使用os.fork子進程來完成。多處理儘可能模擬Python自己的threading模糊界面。使用多處理而不是線程的一個直接好處是,這使得各種工作進程能夠使用不同的CPU內核,實際上並行工作 - 而由於語言設計限制,有效的線程實際上僅限於一次執行一次,即使有幾個可用時,也可以使用單個內核。

現在請注意,仍然存在一些特殊情況 - 特別是如果您是在網絡請求中調用這些特殊功能。檢查這個問題前幾天的答案: Stop a background process in flask without creating zombie processes

2

使用python的多處理模塊。

def func(arg1): 
    ... do something ... 

from multiprocessing import Process 
p = Process(target=func, args=(arg1,), name='func') 
p.start() 

完整的文件建立是在這裏:https://docs.python.org/2/library/multiprocessing.html

編輯:

您還可以使用Python的線程模塊,如果您使用了JPython/CPython的分佈,可以克服GIL(全局解釋鎖定)在這些分佈。

https://docs.python.org/2/library/threading.html

+0

你應該修正/澄清你的關於GIL的句子。 – moooeeeep

1

這個例子也許是適合你:

#!/usr/bin/env python3 

import sys 
import os 
import time 

def forked(fork_func): 
    def do_fork(): 
     pid = os.fork() 
     if (pid > 0): 
      fork_func() 
      exit(0) 
     else: 
      return pid 
    return do_fork 

@forked 
def command1(): 
    time.sleep(2) 

@forked 
def command2(): 
    time.sleep(1) 

command1() 
command2() 
print("Hello") 

你只需要使用裝飾@forked您的功能。

只有一個問題:當主程序結束時,它等待子進程結束。

+0

這是一個很好的例子,但它實際上剛剛開始重新研究Python的多處理功能 - 而且如果打開它的文檔,您會發現有很多事情可以使它正常工作。從「os.fork」在Windows平臺上不起作用的事實開始。 – jsbueno

+0

但是,你有一個非常好的簡單的例子。不管怎麼說,還是要謝謝你。 – jsbueno

+0

我知道多處理模塊。只有一個是跨平臺的。作者提出了在通話時使用最少語法啓動功能的問題。這種方式給了它。有可能在'do_fork()'內使用'multiprocessing'特性編寫代碼,這是更好的,我同意。但我的想法是使用裝飾器輕語法,它不是'os.fork()'或'multiprocess.Process()'。 – ValeriyKr