2

サブプロセス呼び出しを使用して Python 関数を呼び出そうとしています。サブプロセスの例をたくさん見てきましたが、別の python 関数を呼び出すものは見当たりませんでした。それができるかどうかはわかりません。

私の関数fakeFxnは、数秒から数時間かかる処理を行います。特定の時間、たとえば 1 時間以上かかるものはスキップしたい。この関数は、収集する必要のある値も返します。

def fakeFxn(val):
    if (val== "terminate"):
        for i in range(10):
            z = "t"
        return(z)
    else:
        for i in range(100000000): #Instead of infinite loop, here I am doing some big computation
            y = "nt"
        return(y)


import subprocess
elapsedTime = 0
p = subprocess.Popen(retval = fakeFxn("terminate"))
rc = p.poll()  #returncode
while (rc == None):
    sleep(5)
    elapsedTime = elapsedTime + 5
    if(elapsedTime <10):
        rc = p.poll()
        continue
    else:
        rc = "timeout"
        p.kill()
        break

これは良い方法ですか?または、同じことを行う別の方法はありますか? ここで関連する質問をしました:コマンドの実行を突然停止し、次のコマンドに進みます

私の実際の機能は、この投稿の「rpart」機能です。

4

2 に答える 2

2

through についてはわかりませんが、ラッパー関数subprocessの助けを借りてこれを行うことができるはずです:multiprocessing

import time
from Queue import Empty
from multiprocessing import Process, Queue

def fakeFxn(val):
    if val == 'terminate':
        time.sleep(0.1)
        return 't'
    else:
        time.sleep(1000)
        return 'nt'

def ffWrapper(val, queue):
    retval = fakeFxn(val)
    queue.put(retval)

if __name__ == '__main__':
    q = Queue()
    p = Process(target=ffWrapper, args=('terminate', q))
    p.start()
    rc = ''
    try:
        rc = q.get(timeout=10)
    except Empty:
        print 'timeout'
    p.terminate()
    print rc
于 2013-08-01T17:19:38.410 に答える
0

subprocessモジュール内の Python 関数ではなく、外部プログラムの実行に使用する必要があります。

特定のタスクについては、スレッド化またはマルチプロセッシングモジュールを使用することをお勧めします。コードは次のように書き直すことができます (2 秒後にタイムアウトします)。

from multiprocessing import Process
import time


def fake_function(arg):
    time.sleep(arg)
    print arg 


p = Process(target=fake_function, args=(10,))
p.start()
p.join(timeout=2)
p.terminate()
于 2013-08-01T17:00:09.417 に答える