9

私は(多かれ少なかれ)解決する簡単な問題を抱えています
。Pythonマルチプロセッシングチュートリアルを見ると、多かれ少なかれ次のようにプロセスを開始する必要があることがわかります。

from multiprocessing import *

def u(m):
    print(m)
    return

A=Process(target=u,args=(0,))
A.start()
A.join()

0 が出力されるはずですが、何も出力されません。代わりに、A.join().

私が手動で機能を開始した場合、これを行っています

A.run()

実際にはシェルに 0 を
出力しますが、次のコードの出力など、同時には機能しません。

from multiprocessing import *
from time import sleep

def u(m):
    sleep(1)
    print(m)
    return

A=Process(target=u,args=(1,))
A.start()
print(0)


0
1である必要があります

でも実際は
0

最後の行の前に追加すると

A.run()

その後、出力は
1
0になります

これは私には紛らわしいようです...

プロセスに参加しようとすると、永遠に待機します。

ただし、回答を得るのに役立つ場合は、
私のOSはMac os x 10.6.8
です使用されているPythonのバージョンは3.1と3.3です
私のコンピューターには1つのインテルコアi3プロセッサーがあります

--更新--
この奇妙な動作は、IDLE からプログラムを起動した場合にのみ発生することに気付きました。端末からプログラムを実行すると、すべてが想定どおりに機能するため、この問題は IDLE バグに関連している必要があります。
しかし、端末からプログラムを実行するのはさらに奇妙です。 range(100000000) のようなものを使用すると、プログラムの最後までコンピューターのすべての RAM がアクティブになります。私がよく覚えていれば、これはpython 3では発生せず、古いpythonバージョンでのみ発生するはずです。これらの新しい情報が答えを出すのに役立つことを願っています

--Update 2--
これを設定しているため、プロセスから出力を実行しなくてもバグが発生します。

def u():
    return

プロセスのターゲットとしてそれを開始し、プロセスに参加しようとすると、アイドル状態が永遠に待機します

4

4 に答える 4

7

hereおよびhereで提案されているように、問題は IDLE オーバーライドsys.stdinsys.stdoutいくつかの奇妙な方法で、そこから生成されたプロセスにきれいに伝播しないことです (それらは実際のファイルハンドルではありません)。

最初のリンクは、すぐに修正される可能性が低いことも示しています (「「修正できない」問題である可能性があります」と彼らは言います)。

残念ながら、私が提案できる唯一の解決策は、このスクリプトに IDLE を使用しないことです...

于 2013-04-08T05:39:16.083 に答える
0

バッファリングされていない出力を試しましたか? sys モジュールをインポートして、print ステートメントを変更してみてください。

print >> sys.stderr, m

これは動作にどのように影響しますか? 私は、 IDLE が stdio をいじっていると疑う他の人と一緒です。. .

于 2013-04-09T03:39:35.717 に答える
0

IDLEでのみ発生することを考えると、問題は両方のプロセスで使用されるstdoutに関係していると思われます。おそらく、2 つの異なるプロセスから使用するのは安全ではないファイルのようなオブジェクトです。

子プロセスが stdout に書き込んでいない場合は、正常に完了して参加すると思われます。たとえば、代わりにファイルに書き込むことができます。または、親と子の間にパイプを設定することもできます。

于 2013-04-08T03:36:16.353 に答える
0

プログラムに追加しようとしA.join()ましたか?子プロセスが出力される前にメインプロセスが終了しているため、出力が非表示になっていると思います。メイン プロセスに子プロセス ( A.join()) を待機するように指示すると、期待どおりの出力が表示されるはずです。

于 2013-03-29T17:31:44.580 に答える