Python マルチプロセス例外

1. 例外のキャッチ

例外レベル: https://cloud.tencent.com/developer/section/1366492
ここに画像の説明を挿入します
https://zhuanlan.zhihu.com/p/321408784

try:
    <语句>
except Exception as e:
    print('异常说明',e)
1 捕获所有异常
包括键盘中断和程序退出请求(用 sys.exit() 就无法退出程序了,因为异常被捕获了),因此慎用。

try:
    <语句>
except:
    print('异常说明')
2 捕获指定异常
try:
    <语句>
except <异常名>:
    print('异常说明')
万能异常:

try:
    <语句>
except Exception:
    print('异常说明')
一个例子:

try:
    f = open("file-not-exists", "r")
except IOError as e:
    print("open exception: %s: %s" %(e.errno, e.strerror))

2. 例外タイプをキャプチャして決定します
。参考: https://blog.csdn.net/weixin_35757704/article/details/128490868

异常的完整代码是:
try:
    raise Exception("wa")
except:
    print("报错")
else:
    print("没有报错")
finally:
    print("程序关闭")

例外が発生すると、例外情報が sys.exc_info() メソッドに保存されます。

import sys
import os

try:
    raise RuntimeError('这里有个报错')
except Exception as e:
    except_type, except_value, except_traceback = sys.exc_info()
    except_file = os.path.split(except_traceback.tb_frame.f_code.co_filename)[1]
    exc_dict = {
    
    
        "报错类型": except_type,
        "报错信息": except_value,
        "报错文件": except_file,
        "报错行数": except_traceback.tb_lineno,
    }
    print(exc_dict)

積極的に例外をスローする

raise Exception("0不能做分母")


Python はraise ステートメントを使用して前の例外を再スローします

>>> def e():
...     try:
...         int('N/A')
...     except Exception as e:
...         # 做一些记录日志等的处理,然后继续抛出异常
...         raise
... 
>>> e()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in e
ValueError: invalid literal for int() with base 10: 'N/A'
>>> 

2. プログラムを終了します

https://zhuanlan.zhihu.com/p/426492312

Python プロセスを終了するには、exit()、sys.exit()、os._exit()、quit() など、多くのメソッドを聞いたことがあるかもしれません。これらのメソッドはすべてプロセスを終了できます。 。

これら 4 つのメソッドの比較を次の表に示します
該当する関数のシナリオが SystemExit 例外をスローするかどうかは
exit です 対話環境は
終了します 対話環境は
sys.exit メインプロセスは
os._exit 子プロセスはいいえです
。exit と quit はどちらも対話型環境に適用できます。使用すると、これらはすべて組み込み関数であり、すべて SystemExit 例外をスローします。os._exit は SystemExit 例外をスローしません。実行されると終了するため、何もありませ
んクリーンアップ作業を行う時間です
。sys.exit は SystemExit 例外をスローします。これをキャッチできます。この例外に対して、リクエスト作業を実行します
。sys.exit は、Python でプログラムを終了する最も一般的に使用される正式な方法です。指定する必要があります。呼び出し時の終了コード。終了コード 0 は正常終了、それ以外は異常終了を意味します。

import sys

try:
    sys.exit(3)
except SystemExit as e:
    print(f'进程退出,退出码是{
      
      e.code}')
使用e.code可以获得退出码,程序可以根据退出码不同执行相应的清理工作。

Python はコードの実行を終了します
方法 1:
import sys
sys.exit() # シェルを再起動せずに現在のプログラムを終了します
方法 2:
exit() # 現在のプログラムを終了してシェルを再起動します
方法 3:
quit() # 効果exit(). と同じで、シェルを終了して再起動します。

3. プロセス共有変数

Value と Array は共有メモリを通じてデータを共有し、
Manager は共有プロセスを通じてデータを共有します。
「spawn」によりマルチプロセスのデータコピーが可能になります

 	num=multiprocessing.Value('d',1.0)#num=0
    arr=multiprocessing.Array('i',range(10))#arr=range(10)
    p=multiprocessing.Process(target=func1,args=(num,arr))
	manager=Manager()
    list1=manager.list([1,2,3,4,5])
    dict1=manager.dict()
    array1=manager.Array('i',range(10))
    value1=manager.Value('i',1)

プロセス間の共有変数
異なるプロセスで同じ変数の読み取りと書き込みを行う場合は、特別な宣言を行う必要があります。マルチプロセッシングには、メモリを共有する方法とサービス プロセスを使用する方法の 2 つの実装方法があります。共有メモリは、値と配列の 2 つのデータ構造のみをサポートします。
子プロセスとメインプロセスがアクセスするカウントのメモリ内のアドレスは同じです。ここで注意すべき点が 2 つあります。

  • 1. multiprocessing.Value オブジェクトが Process で使用される場合、上記のようにグローバル変数として、または受信パラメーターとして使用できます。ただし、Pool で使用する場合はグローバル変数としてのみ使用でき、受信パラメータとして使用するとエラーが報告されます。RuntimeError: 同期されたオブジェクトは、継承を通じてプロセス間でのみ共有されるべきです
  • 2. 複数のプロセスがシェア変数を読み書きする場合、その操作がプロセスセーフであるかどうかに注意してください。前の累積カウンタの場合、これはステートメントではありますが、読み取りと書き込み、およびプロセスのローカル一時変数が含まれるため、この操作はプロセス安全ではありません。複数の処理を積み重ねると、誤った結果が表示されます。cls.count += 1 をロックする必要があります。ロックするには、外部ロックを使用するか、get_lock() メソッドを直接使用します。
  • 3. 共有メモリは、限られたデータ構造をサポートします。変数を共有するもう 1 つの方法は、サービス プロセスを使用して、共有する必要がある変数を管理することです。他のプロセスが共有変数を操作するとき、それらのプロセスはサービス プロセスと対話します。このメソッドはリストや辞書などの型をサポートしており、複数のマシン間で変数を共有できます。ただし、共有メモリ方式に比べて速度が遅くなります。さらに、このメソッドはプールの受信パラメータとして使用できます。同様に、プロセスセーフでない操作にもロックが必要です。

4. プロセス例外キャプチャ (ノンブロッキング)

1.multiprocessing.Process が例外をキャッチできない

p = multiprocessing.Process(target=taskimg_execute, args=(start_img,))
p.start()

2. プールはそれをキャプチャできず、関数を通じてのみ受信できます。

def throw_error(e):
    print("error回调方法: ", e)
    return {
    
    'code': 440, 'msg': '进程创建异常'+str(e), 'data': {
    
    'status': 400}}

pool = multiprocessing.Pool(processes = 3)
pool.apply_async(taskimg_execute, (start_img,),rror_callback=throw_error)  pool.close()

4. 多重処理プールで起動されたプロセス内のプロセスを再起動します

ご存知のとおり、マルチプロセッシングは Python の組み込みマルチプロセス ライブラリです。そのプールの問題は、複数のプロセスが起動されると、エラーが報告されるため、これらのプロセスで新しいプロセスを起動することが難しいことであるようです - AssertionError: daemonic process are not allowed to have child. 参考: https:// blog
. csdn.net/nirendao/article/details/128945428
マルチプロセス プールを使用せず、そのプロセスのみを使用する場合は、プロセスの作成時にデーモン パラメータを False に設定するか、デーモンを記述しないだけで比較的簡単です。このパラメータはデフォルトで False に設定されているため、使用することもできます。

おすすめ

転載: blog.csdn.net/weixin_44986037/article/details/131521446