39477


一つのCPUで、２つの動作を行いながら、それらの間でやりとりをしたいと考えています。  
というのも、Raspberry
PiとiOSアプリ間でBluetooth通信を行いながら、必要に応じてRaspi上でPythonスクリプトを実行したいからです。

# 実際にそのようなことは可能でしょうか？

今考えている構成は次のようなものです。

* * *

Pythonを実行している時に、threadingモジュールで２スレッドに分けます。

  1. 一つ目のスレッドでは、[subprocessモジュールによってjavascriptファイルを実行します](https://stackoverflow.com/questions/35788729/start-node-app-from-python-script)。

この実行中のjavascript(node.js)では、[blenoというモジュールを用いて、bluetooth
peripheralとして動作させます](https://qiita.com/uzuki_aoba/items/346e28b6e9170ce85a6c)。  
  

  2. 二つ目のスレッドでは、通常のPythonスクリプトが実行されています。例えば、Raspiの純正カメラの制御などを行います。 さらに、こちらはサーバーとして動作させます。一つ目のスレッドの[javascriptの要求に応じて](https://kivantium.net/python-ajax)、写真を取得したり、測定時間を返したりします。これはjQueryやAjaxを使うのが有効であるようです。

[![画像の説明をここに入力](https://i.stack.imgur.com/iJ0nH.jpg)](https://i.stack.imgur.com/iJ0nH.jpg)

* * *

上述のような構成で可能なのかどうか、他にうまいやり方があるかどうか、と言った内容についてご回答いただければ幸いです。

* * *

## 追記：

blenoをわざわざ使う理由（bluezやpybluezなどではなく）は、blenoのインターフェイスが非常に分かりやす‌​いからです。サービスやキャラクタリスティ‌​ックとしての実装が簡単です。


CC BY-SA 3.0
2017-11-09T07:09:14.487
39451
2017-11-10T08:15:57.993
2020-06-17T08:14:45.997
-1
14383
question
javascript python raspberry-pi
メインのPythonを2つのスレッドに分け、このスレッド間でやりとりをしたい。


> 一つのCPUで、２つの動作を行いながら、それらの間でやりとりをしたいと考えています。  
>  実際にそのようなことは可能でしょうか？

可能です。

モダンなオペレーティング・システムは何らかのマルチタスキング機構を備えているため、単一CPUであっても複数タスクを並行に処理することが出来ます。

  * マルチプロセス：OS上で複数のプロセス(process)を同時稼動させる方式。プロセス間の結合度は低く、データ共有にはプロセス間通信(IPC; Inter Process Communication)機構が必要。
  * マルチスレッド：単一プロセス内に、複数のスレッド(thread)を同時稼動させる方式。スレッド間の結合度は高く、同一メモリ空間を共有するため特別な通信機構は不用。

* * *

> 一つ目のスレッドでは、subprocessモジュールによってjavascriptファイルを実行します。  
>  二つ目のスレッドでは、通常のPythonスクリプトが実行されています。

ただし、その実現手段としてPythonのthreadingモジュール（マルチスレッド）が好ましいかといえば、質問中にある要件に対しては「適切でない」と考えます。

  * **前提：** 「マルチスレッド」よりも「マルチプロセス」の方がプログラミングモデルが単純であり、並行処理プログラム特有の難解さ・困難さが抑えられます。
  * 本質的にはJavaScriptスクリプトとPythonスクリプト間の連携ですから、それぞれのインタプリタ(Node.js, CPython)プロセスを立ち上げる単純な「マルチプロセス」並行処理で十分です。
  * スクリプト間でのローカル通信による"疎な"連携を想定しているようようですから、分離独立性の高い「マルチプロセス」並行処理で十分です。


CC BY-SA 3.0
2017-11-10T08:15:57.993
39477
2017-11-10T08:15:57.993
49
39451
answer