前提・実現したいこと
- ファイル「asd.py」で「class dsa」を用意
- 1つ目のプロセスで、一定間隔で「dsa.a」の値を変更(task関数)
- 2つ目のプロセスファイル「dsa.a」の値を利用(printing関数)。
ですが、両方どうすれば、共有できるのでしょうか?
※同時アクセスによるデータ整合性は無視する。
発生している問題・エラーメッセージ
console
1task = 1 2printing = 0 3printing = 0 4task = 2 5printing = 0 6printing = 0 7printing = 0 8task = 3 9printing = 0 10printing = 0 11printing = 0 12task = 4 13printing = 0 14printing = 0 15printing = 0
該当のソースコード
py
1#main.py 2import concurrent.futures as confu 3import time 4import asd 5 6# クラス変数出力 7def printing(): 8 while(1): 9 time.sleep(1) 10 print("printing = ", asd.dsa.a) 11 12# クラス変数変更 13def task(): 14 asd.dsa.a += 1 15 print("task = ",asd.dsa.a) 16 17 18def main(): 19 # - - - - 処理開始 - - - - # 20 with confu.ProcessPoolExecutor(max_workers=2) as executor: 21 executor.submit(printing) 22 for i in range(50): 23 executor.submit(task) 24 time.sleep(3) 25 26 # - - - - 並列処理が終わった後 - - - - # 27 # print(asd.dsa.a) 28 29if __name__ == '__main__': 30 main()
py
1# asd.py 2class dsa: 3 a = 0
試したこと
multiprocessingのValueにClassを入れる。
= 当然エラー
追記
「= 当然エラー」とはどんなコードを書いてどんなエラーが出たのでしょうか?
以下のとおり(main.py)です。なぜ、第一引数を「i」にしてるかは、適当に選んだからです。
第一引数の候補は、「sharedctypes.py」に存在する「typecode_to_type」の中から選ぶものです。(間違っていたらごめんなさい。)
その中にClassの引数が存在しなかったので、当然エラーと書きました。
py
1#main.py 2dsa = Value('i', asd.dsa)
console
1TypeError: an integer is required
py
1#sharedctypes.py 2typecode_to_type = { 3 'c': ctypes.c_char, 'u': ctypes.c_wchar, 4 'b': ctypes.c_byte, 'B': ctypes.c_ubyte, 5 'h': ctypes.c_short, 'H': ctypes.c_ushort, 6 'i': ctypes.c_int, 'I': ctypes.c_uint, 7 'l': ctypes.c_long, 'L': ctypes.c_ulong, 8 'q': ctypes.c_longlong, 'Q': ctypes.c_ulonglong, 9 'f': ctypes.c_float, 'd': ctypes.c_double 10 } 11```c
回答1件
あなたの回答
tips
プレビュー