0

2 つの主要なタスクを実行する Python スクリプトがあります。

  • スクリプト自体からコードを実行する
  • バックグラウンドプロセスを起動しますmultiprocessing.Process(target=...)

私の質問は:stdoutメイン プロセスに影響を与えることなく、その特定のプロセスからミュートする方法はありますか? で変更しようとしましたsys.stdoutが、すべてのプロセスとメイン プロセスに影響します (プログラムのすべてのインスタンスが同じオブジェクトを指しています)。

>>> import multiprocessing
>>> import sys
>>> def a():
...     print('{} - {}'.format(sys.stdout, id(sys.stdout)))
... 
>>> for i in range(5):
...     multiprocessing.Process(target=a).start()
... 
<_io.TextIOWrapper name='<stdout>' mode='w' encoding='UTF-8'> - 140230387621232
<_io.TextIOWrapper name='<stdout>' mode='w' encoding='UTF-8'> - 140230387621232
<_io.TextIOWrapper name='<stdout>' mode='w' encoding='UTF-8'> - 140230387621232
<_io.TextIOWrapper name='<stdout>' mode='w' encoding='UTF-8'> - 140230387621232
>>> <_io.TextIOWrapper name='<stdout>' mode='w' encoding='UTF-8'> - 140230387621232

>>> a()
<_io.TextIOWrapper name='<stdout>' mode='w' encoding='UTF-8'> - 140230387621232

プロセスによって実行されている関数からすべてのステートメントを削除するprint()ことはできません。これは、プログラムの別のルーチンがメイン プロセスでその関数を呼び出し、それらの print ステートメントが必要になるためです。

また、印刷を実行する必要があるかどうかを示すためにブール値フラグを使用できることにも気付きましたが、誰かが私にもっと良いアプローチをしてくれることを望んでいました.

どうもありがとうございました!

4

2 に答える 2

0

フォークの後、プロセス内でそれを行う必要があります。これは少し大雑把ですが、機能しているようです:

#!/usr/bin/env python3

import multiprocessing
import sys

class SinkLogger(object):
    def __init__(self):
        pass

    def write(self, message):
        pass

    def flush(self):
        pass  

def a(i):
    if (i % 2 == 1):
        sys.stdout = SinkLogger()
    print('{} - {} - {}'.format(i, sys.stdout, id(sys.stdout)))

for i in range(5):
    multiprocessing.Process(target=a, args=(i,)).start()

print("done")

アイデアのソース:スクリプトを使用して stdout をファイルとコンソールの両方にリダイレクトする方法は?

于 2020-06-01T12:13:57.563 に答える