2

threading複数のデバイスからデータを収集する作業を行っています。テストは長時間にわたるため、PythonとQueueモジュールを使用したいと考えています。これらの使用方法を理解するために短いスクリプトを書きましたが、これを機能させるためのニュアンスを理解していないことは明らかです。

これが私のスクリプトです:

import ue9
import LJ_Util
import DAQ_Util
import threading
import Queue

from datetime import datetime
from time import sleep

queue = Queue.Queue()
now = datetime.now().isoformat()

def DAQThread(ue9ipAddr):
    print '\nExecuting in DAQThread at IP Address: %s' % ue9ipAddr
    a = ue9.UE9(ethernet=True, ipAddress=ue9ipAddr)
    SN = (a.commConfig()).get('SerialNumber')
    count = 5
    while count > 0: 
        reading = a.feedback()
        dataReturn = (SN, now, reading)
        queue.put(dataReturn)
        count -= 1
        print count
        sleep(5)


def listenThread(counter): 
    while queue.empty() != True:
        try: 
            outcome = queue.get() 
            print outcome 
            counter -=1 
            print counter 
        except: 
            return 'queue.get() command loop failing.' 


print "\nOpening device..."
ipAdd = '192.168.1.127'
feedbackThread = threading.Thread(target=DAQThread, args=(ipAdd,))
feedbackThread.start()

print "\nListening for data..."
queryThread = threading.Thread(target=listenThread, args = (10,))
queryThread.start()

print queue.get()
print(threading.activeCount())
print "\nDone"

このスクリプトを実行した結果の出力結果は次のとおりです。

$ python threading-and-queue-test.py

Opening device...

Executing in DAQThread at IP Address: 192.168.1.127
Listening for data...

4
 (278956853, '2012-09-03T20:02:47.656024', {'AIN4': -0.012, 'AIN5': -0.012, 'CIODir': 0, 'AIN7': -0.012, 'EIODir': 0, 'AIN1': -0.012, 'AIN2': -0.012, 'AIN3': -0.012, 'MIOState': 7, 'AIN8': -0.012, 'AIN6': -0.012, 'AIN9': -0.012, 'CIOState': 15, 'AIN0': -0.012, 'Counter0': 0, 'Counter1': 0, 'EIOState': 255, 'TimerC': 0, 'TimerB': 0, 'TimerA': 0, 'MIODir': 0, 'FIODir': 32, 'AIN14': -0.012, 'AIN15': -0.012, 'AIN12': -0.012, 'AIN13': -0.012, 'AIN10': -0.012, 'AIN11': -0.012, 'FIOState': 255})
2

Done
3
2
1
0
$

スレッド アクティビティのタイミングが「オフ」であることは明らかですが、これらのモジュールを使ってプログラミングしたことも、一般的にスレッドを使用したこともないため、修正方法がわかりません。コメントや提案は大歓迎です。前もって感謝します!

4

1 に答える 1

2

コメントで述べたように、1つの問題はリスニングスレッドにあります。キューからエントリを「取得」すると、キューにエントリはなくなり、5秒ごとにエントリを追加するだけなので、リスニングスレッドはキューを空にします。

while queue.empty() != TrueFalseと評価され、ループを終了します

例えば:

>>> import Queue
>>> q=Queue.Queue()
>>> q.put(1)
>>> q.empty()
False
>>> q.get()
1
>>> q.empty()
True
>>> q.empty()!=True
False

これを回避する1つの方法は、別のキューを停止キューまたはキャンセルキューとして使用することです。これにより、リスニングスレッドを変更すると、次のようになります。

stopQue=Queue.Queue()

def listenThread(counter): 
    while True:
        if queue.empty()!=True: 
            outcome = queue.get() 
            print outcome 
            counter -=1 
            print counter 
        if stopQue.empty()!=True:
            break
    print 'Exiting Listening Thread'

そうすれば、stopQueに何かを入れると、つまりstopQue.put(1)、終了するはずです。

初期コードに基づく完全な例。キューとスレッド化に関係のないコードを切り取りました。

import threading
import Queue
from time import sleep

dataQue = Queue.Queue()
stopQue = Queue.Queue()

def DAQThread(ue9ipAddr):
    print 'Executing in DAQThread\n'
    count = 5
    while count > 0: 
        dataQue.put('data: %s' % count)
        count -= 1
        sleep(5)
    stopQue.put(1)
    print 'Exiting DAQThread\n'


def listenThread(counter): 
    while True:
        if dataQue.empty() != True:
            outcome = dataQue.get() 
            print outcome 
            counter -=1 
        if stopQue.empty() != True:
            break
    print 'Exiting Listening Thread'


print "Opening device..."
ipAdd = '192.168.1.127'
feedbackThread = threading.Thread(target=DAQThread, args=(ipAdd,))
feedbackThread.setDaemon(True)
feedbackThread.start()

print "Listening for data..."
queryThread = threading.Thread(target=listenThread, args = (10,))
queryThread.setDaemon(True)
queryThread.start()

print "Done"

出力を生成します:

>>> 
Opening device...
Executing in DAQThread
Listening for data...

Donedata: 5        #Notice how the script is done however the threads are still running

>>> data: 4
data: 3
data: 2
data: 1
Exiting DAQThread
Exiting Listening Thread
于 2012-09-04T02:29:37.127 に答える