TwistedAMPの使い方を学んでいます。クライアントからサーバーにデータを送信し、SQLite3DBにデータを挿入するプログラムを開発しています。次に、サーバーは成功またはエラーを示す結果をクライアントに送り返します(これを行うには最善の方法ではないかもしれませんが、主な問題を解決するための一時的な解決策にすぎません)。これを行うために、元々合計を行って結果を返した例を変更したので、これが私がやろうとしていることを行うための最も効率的な方法ではない可能性があることに気付きました。特に、複数の挿入でいくつかのタイミングを実行しようとしています(つまり、複数の挿入のためにデータをサーバーに複数回送信します)。作成したコードを含めました。
ClientCreatorをreactor.callWhenRunning()に渡すなど、これを回避するいくつかの方法を試しましたが、延期してこれを行うことはできません。
これを行う方法についての提案、アドバイス、またはヘルプをいただければ幸いです。これがコードです。
サーバ:
from twisted.protocols import amp
from twisted.internet import reactor
from twisted.internet.protocol import Factory
import sqlite3, time
class Insert(amp.Command):
arguments = [('data', amp.Integer())]
response = [('insert_result', amp.Integer())]
class Protocol(amp.AMP):
def __init__(self):
self.conn = sqlite3.connect('biomed1.db')
self.c =self.conn.cursor()
self.res=None
@Insert.responder
def dbInsert(self, data):
self.InsertDB(data) #call the DB inserter
result=self.res # send back the result of the insertion
return {'insert_result': result}
def InsertDB(self,data):
tm=time.time()
print "insert time:",tm
chx=data
PID=2
device_ID=5
try:
self.c.execute("INSERT INTO btdata4(co2_data, patient_Id, sensor_Id) VALUES ('%s','%s','%s')" % (chx, PID, device_ID))
except Exception, err:
print err
self.res=0
else:
self.res=1
self.conn.commit()
pf = Factory()
pf.protocol = Protocol
reactor.listenTCP(1234, pf)
reactor.run()
クライアント:
from twisted.internet import reactor
from twisted.internet.protocol import ClientCreator
from twisted.protocols import amp
import time
class Insert(amp.Command):
arguments = [('data', amp.Integer())]
response = [('insert_result', amp.Integer())]
def connected(protocol):
return protocol.callRemote(Insert, data=5555).addCallback(gotResult)
def gotResult(result):
print 'insert_result:', result['insert_result']
tm=time.time()
print "stop", tm
def error(reason):
print "error", reason
tm=time.time()
print "start",tm
for i in range (10): #send data over ten times
ClientCreator(reactor, amp.AMP).connectTCP(
'127.0.0.1', 1234).addCallback(connected).addErrback(error)
reactor.run()
コードの終わり。
ありがとうございました。