2017-07-20 5 views
0

私は特定のUDP要求に応答して潜在的に大きなファイルをコピーするアプリケーションを開発しています。私はこれらの要求を聞いて処理するためにpyuvを使用しています。これらのコピー操作を完了するために別のプロセスを作成したいので、私のメインループは保持されません。pyuvプロセスがファイルの代わりに関数を実行しています

現在、私はPythonのmultiprocessingpyuvライブラリを以下の方法で使用しています。 self.perform_actionはこのようなものになります

# Get read and write pipes from the OS 
r, w = os.pipe() 

# Construct pyuv reading pipe and assign callback 
pipe_read = pyuv.Pipe(self.loop) 
pipe_read.open(r) 
pipe_read.start_read(self.read_pipe) 

# Construct pyuv writing pipe 
pipe_write = pyuv.Pipe(self.loop) 
pipe_write.open(w) 

# Keep track of pending file operations associated with the read_pipe fileno() 
# Allows us to correctly close both pipes 
self.pending[pipe_read.fileno()] = (msg.refDataID, msg.refDataSubID, pipe_read, pipe_write, msg.lastEventTime) 

# Spawn off a process to operate on the files and write to the pipe 
p = Process(target=self.perform_action, args=(pipe_write, src, dest,)) 
p.start() 

:私は、戻り値を取得するには、パイプを使用しています

def perform_action(self, pipe, src, dest): 
    ret_val = self.copy_function(src, dest) 
    pipe.write(str(ret_val) # Write the return value to the pipe - triggers the read_pipe callback 

- 私はプロセスが完了したときにコールバックが起動するようにしたいのでとも(pipe_read.start_read(self.read_pipe)は、コールバックを割り当て何かがパイプに書き込まれるたびに)。

私はpyuv.Processhttp://pyuv.readthedocs.io/en/v1.x/process.html)モジュールを利用して上記を補完したいと思っていますが、ファイルの代わりに関数をターゲットにするためのドキュメントや例はありません。私のプロセスが終了したときにコールバックを起動し、ret_valを返すためにパイプを使用すると、何かが間違っていると感じています。pyuv.Processをコールして、callback(process_handle, exit_status, term_signal)コールバックを使用するといいでしょう。

アイデア?これは可能なようですか?

答えて

1

pyuv作成者:-)これは不可能ですが、libuvのuv_spawn関数は新しいプロセス自体を作成します。しかし、あなたの処理関数を別のpythonファイルに入れて、代わりにそれを生成することができます。

+0

ありがとうございました!正確には私が探しているものではありませんが、悪くすることができます。 – wKavey

関連する問題