1

私はPython(およびプログラミング全般)が初めてなので、しばらくお待ちください。

私はいくつかのラボ機器の自動化を行っており、別の機器でデータを取得しながら、ある機器の電源を切り替える方法を探しています。これらのイベントを互いに非同期にしたい、つまり、データ取得プロセス中に電源をランダムに切り替えたい。

私は以下をチェックアウトしました:

-time.sleep--電源の応答が非常に遅かったため、実際にこれを1つのセットアップで正常に使用できました-電源を切るように指示し、ランダムな時間スリープしてから、その他の機器。これは、電源が常に他の機器よりもはるかにゆっくりと反応することに依存していますが、通常はそうではありません.

- マルチプロセッシング/スレッディング - 私は SO と python.org でこれについて読んでいますが、これが私が望むことを達成するかどうかはまだはっきりしていません. 私はそれをテストしようとしましたが、コード化するのが難しいと感じています。私が望むものに遠く及ばない場合は、これ以上時間を投資したくありません.

つまり、一言で言えば、マルチプロセッシングは私が望むことをしますか? これを行う他の方法はありますか?

4

4 に答える 4

3

これらは状態の共有を必要としないため、これらを 2 つの完全に別個のスクリプトとして記述しない理由は考えられません。

于 2012-07-10T23:47:32.983 に答える
1

Python またはほとんどのプログラミング言語で 2 つのことを並行して行う場合は、スレッドを使用します。それが彼らの目的です。これは、Python でスレッド化を行う方法に関する 1 つのチュートリアルです

1 つのスレッドが電源を切り替え、もう 1 つのスレッドがデータを受け取ります。

于 2012-07-10T23:37:36.237 に答える
1

バックグラウンドで実行したいタスク (電源切り替えまたはデータ取得) のスレッドを作成する単純なスレッド モデルが必要なようです。例を次に示します (テストされていないコード):

from threading import  Thread                                                                                       

def take_data():
    while 1:                                                                            
        data = go_fetch_more_data()

data_thread = Thread(target=take_data)
data_thread.start()

while 1: 
    sleep_seconds = random.randint(0, 60)        
    time.sleep(sleep_seconds)
    toggle_power()

注 - このアプローチでプログラムを停止する唯一の方法は、プログラムを強制終了することです。何らかのシャットダウン信号を監視する必要がある場合は、それぞれに対してスレッドを作成する必要があります。次に、各スレッドを適切にシャットダウンする方法が必要になります。例を挙げたいと思いますが、Python のベスト プラクティスについては完全にはわかりません。

于 2012-07-10T23:46:19.747 に答える
0

asyncoroは、コルーチンによる非同期イベント処理をサポートします。asyncoro を使用したプログラミングは、非同期完了に「yield」を使用することを除いて、スレッドのプログラミングと非常によく似ています。あなたの問題はで実装することができます

import asyncoro, random

def collect(coro=None):
   while True:
      # collect data every 10 seconds?
      yield coro.sleep(10)
      data = read_data()

def toggle(coro=None):
    while True:
        yield coro.sleep(random.randint(10,30))
        toggle_power()

collector = asyncoro.Coro(collect)
toggler = asyncoro.Coro(toggle)

この特定のタスクにはスレッドで十分ですが、asyncoro フレームワークは、同時実行、分散、フォールト トレラント プログラミングのサポートなど、多くの機能を提供します。問題のドメインを考えると、メッセージ (チャネル、またはコルーチンを使用したポイント ツー ポイント通信) との通信が役立つ可能性があると思います。

于 2012-07-11T17:48:21.013 に答える