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

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

ただいまの
回答率

90.45%

  • Python 3.x

    10333questions

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

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 194

calpis123

score 3

 前提・実現したいこと

パイソン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

 該当のソースコード

import serial
from multiprocessing import Pool, Value, Process
import RPi.GPIO as GPIO
import sys
import time

GPIO.setmode(GPIO.BCM)
GPIO.setup(14, GPIO.OUT)
GPIO.setup(15, GPIO.OUT)
GPIO.setup(18, GPIO.OUT)


def A():
    ser = serial.Serial('/dev/ttyACM0', 9600, timeout = None)
    line = ser.readline()
    shared_count.value = (int(line.strip().decode('utf-8')))
    MAX_TIME = 50
    st = time.time()
    while True:
        print(int(line.strip().decode('utf-8')))
        time.sleep(0.01)
        if (time.time() - st) > MAX_TIME:
            sys.exit()


def B():
    p = GPIO.PWM(18, 1)
    Hz = 700
    p.ChangeFrequency(Hz)
    duty = 0.0
    p.start(duty)
    while True:
        global shared_count, shared_value
        shared_count = count
        shared_value = value
        duty = (count / 10) % 101
        p.ChangeDutyCycle(duty)
        time.sleep(0.1)
        GPIO.output(14, True)
        GPIO.output(15, False)



jobs = [
    Process(target = A()),
    Process(target = B())
    ]

for j in jobs:
    j.start()

for j in join:
    j.join()

 試したこと

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

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

jobs = [
    Process(target = A()),
    Process(target = B())
    ]

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


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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/30 16:17

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

    キャンセル

  • 2018/10/30 16:32

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

    キャンセル

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/30 16:18

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

    キャンセル

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

  • ただいまの回答率 90.45%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Python 3.x

    10333questions

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