質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

2492閲覧

multiprocessingをpython3で使うときに2つの関数のうち片方の関数の結果をリアルタイムで共有したいです

calpis123

総合スコア15

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/10/30 06:39

前提・実現したいこと

パイソン3で並行処理を利用して2つの関数を定義して使っていますが、片方はarduinoを利用して可変抵抗の値をデジタルの0~1023で読み取っています。
もう片方のプログラムでその値を読み取りながら利用してモーターコントローラの制御に使用してモーターの回転速度を変えるためDuty比が可変になるようにしたいです。
どうかお助け願います。よろしくお願いいたします。

発生している問題・エラーメッセージ

2つの関数の間で変数の共有をすればいいのではと考えてmultiprocessingで共有メモリーのValueクラスを用いてみましたがうまいこと共有できません。エラーメッセージは以下のものです。

Traceback (most recent call last): File "/home/pi/並行処理(multiprocessing).py", line 45, in <module> Process(target = A()), File "/home/pi/並行処理(multiprocessing).py", line 16, in A shared_count.value = (int(line.strip().decode('utf-8'))) NameError: name 'shared_count' is not defined

該当のソースコード

python3.5.3

1import serial 2from multiprocessing import Pool, Value, Process 3import RPi.GPIO as GPIO 4import sys 5import time 6 7GPIO.setmode(GPIO.BCM) 8GPIO.setup(14, GPIO.OUT) 9GPIO.setup(15, GPIO.OUT) 10GPIO.setup(18, GPIO.OUT) 11 12 13def A(): 14 ser = serial.Serial('/dev/ttyACM0', 9600, timeout = None) 15 line = ser.readline() 16 shared_count.value = (int(line.strip().decode('utf-8'))) 17 MAX_TIME = 50 18 st = time.time() 19 while True: 20 print(int(line.strip().decode('utf-8'))) 21 time.sleep(0.01) 22 if (time.time() - st) > MAX_TIME: 23 sys.exit() 24 25 26def B(): 27 p = GPIO.PWM(18, 1) 28 Hz = 700 29 p.ChangeFrequency(Hz) 30 duty = 0.0 31 p.start(duty) 32 while True: 33 global shared_count, shared_value 34 shared_count = count 35 shared_value = value 36 duty = (count / 10) % 101 37 p.ChangeDutyCycle(duty) 38 time.sleep(0.1) 39 GPIO.output(14, True) 40 GPIO.output(15, False) 41 42 43 44jobs = [ 45 Process(target = A()), 46 Process(target = B()) 47 ] 48 49for j in jobs: 50 j.start() 51 52for j in join: 53 j.join() 54 55 56 57 58 59 60 61 62 63

試したこと

プログラミングにまったく知識がない状態なので試したことは文の上下を入れ替えたり程度です・・・

補足情報(FW/ツールのバージョンなど)

ツールは
Arduino Uno
Raspberry3
モータードライバはTOSHIBA TA7291Pです

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

シリアル通信の結果を持ってきてPWMを変化させるだけなら、そもそもmultiprocessingもマルチスレッドも不要で、単なるループの処理で十分だと思いますが

投稿2018/10/30 07:09

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

calpis123

2018/10/30 07:18

ご回答ありがとうございます! 頑張ります!
guest

0

ベストアンサー

質問文のコードは共有メモリを使えていません。というか、それ以前に

python

1jobs = [ 2 Process(target = A()), 3 Process(target = B()) 4 ]

でtargetにはA(), B()の結果が代入されているので、マルチプロセスの処理すら動いてません。target = A等とする必要があります。


やりたいこと的にはマルチスレッドで十分なのでは。それなら、値の共有には単にグローバル変数を使えば良いです。

参考:
Pythonの並列・並行処理サンプルコードまとめ - Qiita
pythonでマルチスレッドで処理して各スレッドの結果を受け取る - Qiita

投稿2018/10/30 06:48

hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

calpis123

2018/10/30 07:17

ご回答ありがとうございます!もし良かったら私のやりたいと思うことを実現するためにグローバル変数をどのように使えばいいか少しコードを教えてもらえたりって出来ますか? サイトを参考にさせて頂いたのですがどう利用していいかわからず困りまして(;^ω^)
hayataka2049

2018/10/30 07:32

ラズパイとアルディーノは触ったことがないので、申し訳ありませんが具体的な内容についてはお答えできません; 頑張ってください!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問