2017-08-02 10 views
0

私はPythonでバーチャルアシスタントをコーディングしています。各リクエスト、応答、考えられるエラーをデータベースに保存したいと思います。 私は要求に対して1つのクラスを使用していますが、応答のための別のクラスとエラーのための別のクラスを使用しています。
はどのようにして、たとえば、respectivesクラスのインスタンスで共有されるID変数を作成することができます。クラス間で増分IDを共有

プログラム(プログラムの正常な、正しいランニング)の

最初の実行:

request_id = 1 
response_id = 1 

セカンドラン(エラーが発生し、応答クラスに進むためのプログラムを停止):

request_id = 2 
error_id = 2 

3回目(プログラムは罰金実行し、応答クラスにid 2スキップ - 私が望む動作です を):

request_id = 3 
response_id = 3 

response_idid 3を受け、response_id = 2 3回目では、ということ要求に応じて開始されたプロセスを2回目の実行で引き起こし、エラーで停止します。

ID変数は、プログラムがクラッシュしても常に一意でなければならず、再起動する必要があります。プログラムが実行されているときにデータベースの最後のIDを取得できることはわかっていますが、データベースを集中させることなくそれを行う方法はありますか?

答えて

1

あなたはデータベースを使用してリクエストとレスポンスを保存しているので、なぜこのIDを生成するためにデータベースを使用しないのですか?

これは、プライマリキーint auto incrementを使用してテーブルを作成することで実行できます。すべてのリクエスト/レスポンスはデータベースに挿入され、データベースは挿入されたレコードごとに固有のIDを生成します。

+0

しかし、それは右の三つの異なるテーブルを使用可能です:

出力はすべきですか?リクエスト用に1つ、レスポンス用に1つ、エラー用に1つを使用します。 –

+0

はい。各テーブルに自動インクリメントの整数プライマリキーがあることを確認してください。 – shanmuga

0

解決策は、DBの代わりにPyro4を使用し、不要にすることです。

Tracker.py

import Pyro4 

@Pyro4.expose 
@Pyro4.behavior(instance_mode="single") 
class Tracker(object): 
    def __init__(self): 
     self._id = None 

    def setId(self, value): 
     print "set well :)", value 
     self._id = value 
    print self._id 

    def getId(self): 
    print "returning", self._id 
     return self._id 

daemon = Pyro4.Daemon()     
uri = daemon.register(Tracker) 

print("URI: ", uri)  
daemon.requestLoop()     

Status.py

import Pyro4 

class Status(object): 
    def __init__(self, id): 
     self._id = id 
     self._pyro = None 

    def connect(self, target): 
     self._pyro = Pyro4.Proxy(target) 

    def updateId(self): 
     if (not self._pyro is None): 
      self._pyro.setId(self._id) 
      print "updated" 
     else: 
      print "please connect" 

    def getId(self): 
     if (not self._pyro is None): 
      return self._pyro.getId() 
     else: 
      print "please connect" 

Success.py

from Status import * 
class Success(Status): 
    def __init__(self): 
     super(Success,self).__init__(1) 

Wait.py

from Status import * 
class Wait(Status): 
    def __init__(self): 
     super(Wait,self).__init__(1) 
:あなたは、次のコードを使用することができますもちろん

Error.py

from Status import * 
class Error(Status): 
    def __init__(self): 
     super(Error,self).__init__(3) 

run.py

from Success import * 
from Wait import * 
from Error import * 

#just an example 
s = Success() 
w = Wait() 
e = Error() 

s.connect("PYRO:[email protected]:51464") 
s.updateId() 
print s.getId() 
w.connect("PYRO:[email protected]:51464") 
w.updateId() 
print s.getId() 
e.connect("PYRO:[email protected]:51464") 
e.updateId() 
print s.getId() 

ますが、別のURIを使用する必要があるだろうが、あなたは今、良いアイデアを持っている必要があります。 Pyroを使用して、必要に応じて静的URI名を指定することもできます。

$ c:\Python27\python.exe run.py 
updated       
1        
updated       
2        
updated       
3 

HTH

+0

答えをありがとうが、単純なID実装には時間がかかりすぎる。 –

+0

こんにちは、問題ありません。私はあなたがdbを使いたくないと理解しました。ありがとう – Alberto

関連する問題