2016-07-19 5 views
1

私は、次の機能を持っている:Python:スレッドや例外で何が問題になりましたか?

def getSuggestengineResult(suggestengine, seed, tablename): 
    table = getTable(tablename) 

    for keyword_result in results[seed][suggestengine]: 
     i = 0 
     while True: 
      try: 
       allKeywords.put_item(
        Item={ 
         'keyword': keyword_result 
        } 
       ) 
       break 
      except ProvisionedThroughputExceededException as pe: 
       if (i > 9): 
        addtoerrortable(keyword_result) 
        print(pe) 
        break 
       sleep(1) 
       i = i + 1 
       print("ProvisionedThroughputExceededException in getSugestengineResult") 

機能はもっとして1つのスレッドで開始されます。私はこのプロセスを持っていて、プロセスが機能するならば、その関数はスレッド内で準備ができているはずです。それ以外の場合は、再度9回試してください。今私の問題: "print(" getSugestengineResultで "ProvisionedThroughputExceededException") "印刷されませんでした。 peが印刷されるだけの例外です。だから私の問題がある?すべてのスレッドが同じ "i"で動作していますか?それとも印刷物に到達することは決してできませんか?

from multiprocessing import Lock, Process, Value 

class ThreadCounter(object): 
    def __init__(self, initval=0): 
     self.val = Value('i', initval) 
     self.lock = Lock() 

    def increment(self): 
     with self.lock: 
      self.val.value += 1 

    def value(self): 
     with self.lock: 
     return self.val 

、あなたはあなたの関数にカウンターを渡すことができます:私はあなたがすべてのあなたのスレッドが同じカウンタを持つようにしたい場合は、特定のカウンタを使用する必要が

+0

知って良いと同じ 'i' – pwnsauce

+0

@pwnsauceにアクセスする別のスレッドのarn'tと共有されます。しかし、なぜ私のプログラムは例外トレースバックを発音する前にメッセージを9回印刷しないのですか? – tommitomtom

+0

あなたは出力が 'print(pe)'でプログラムが停止していることを意味していますか?あなたは 'print i'を除いて何の出力ですか? – pwnsauce

答えて

0

...私が間違ってdoinの午前何を知りません

counter=ThreadCounter(0) 
def getSuggestengineResult(suggestengine, seed, tablename,counter): 
    ... 
    except ProvisionedThroughputExceededException as pe: 
      if (counter.value() > 9): 
       ... 
      counter.increment() 
      ... 

このカウンタは、他のスレッド

+0

ああ、私は間違って尋ねたと思う。私はすべてのスレッドが同じ値にアクセスする必要はありません。私はそれをスレッドセーフなものにしたかった。しかし、私の機能は決してメッセージを出力しません。理由はわかりません:( – tommitomtom

+0

スレッドセーフであるために、あなたのリソースは一度に1つのスレッドだけにアクセスされます。 – pwnsauce

関連する問題