2016-10-08 10 views
0

マルチスレッドを使用して無限ループ(遅れて数秒後にデータをチェック)する関数を実行しようとしています。私はcsvファイルからデータを読み込んでいるので、Queuesも使用しています。マルチスレッドとキューの使用中に無限ループが自動的に終了する

マルチスレッド/キューを使用していないときに私の現在の機能はうまく動作しますが、それらを使用すると、この関数は一度ループしてから停止します。

私の関数は無限ループです。最初のTrueループはスレッドのためのものであることに注意してください(私がcsvの行より少ないスレッド数を使用する場合)、関数はTrueループの間だけ2番目の関数しか必要としません。

def doWork(q): 
    while True: 
     #logging.info('Thread Started') 
     row=q.get() 

     url = row[0] 
     target_price = row[1] 
     #logging.info('line 79') 

     while True: 
      delay=randint(5,10) 
      headers = {'User-Agent': generate_user_agent()} 
      print datetime.datetime.strftime(datetime.datetime.now(), '%Y-%m-%d %H:%M:%S')+': '+'Sleeping for ' + str(delay) + ' seconds' 
      #logging.info('line 81') 
      eventlet.sleep(delay) 
      try: 
       #logging.info('line 85') 
       with requests.Session() as s: 
        #logging.info('line 87') 
        with eventlet.Timeout(10, False): 
         page = s.get(url,headers=headers,proxies=proxyDict,verify=False) 
        #logging.info('line 89') 
        tree = html.fromstring(page.content) 
        #logging.info('line 91') 
        price = tree.xpath('//div[@class="a-row a-spacing-mini olpOffer"]/div[@class="a-column a-span2 olpPriceColumn"]/span[@class="a-size-large a-color-price olpOfferPrice a-text-bold"]/text()')[0] 
        title = tree.xpath('//h1/text()')[0] 
        #logging.info('line 93') 
        new_price = re.findall("[-+]?\d+[\.]?\d+[eE]?[-+]?\d*", price)[0] 
        #logging.info('line 95') 
        old_price = new_price 
        #logging.info('line 97') 
        #print price 
        print new_price 
        print title + 'Current price:' + new_price 
        if float(new_price)<float(target_price): 
         print 'Lower price found!' 
         mydriver = webdriver.Chrome() 
         send_simple_message() 
         login(mydriver) 
         print 'Old Price: ' + old_price 
         print 'New Price: ' + new_price 
        else: 
         print 'Trying again' 
       q.task_done() 
      except Exception as e: 
       print e 
       print 'Error!' 
       q.task_done() 

ここに私のスレッドドライバ機能があります。

q = Queue(concurrent * 2) 

if __name__ == "__main__": 

    for i in range(concurrent): 
     t = Thread(target=doWork,args=(q,)) 
     t.daemon = True 
     t.start() 
    try: 
     with open('products.csv','r') as f: 
      reader = csv.reader(f.read().splitlines()) 
      for row in reader: 
       q.put((row[0],row[1])) 
     q.join() 
    except KeyboardInterrupt: 
     sys.exit(1) 

答えて

0

同じ問題に直面している方は、ここで解決してください。

whileループからq.task_done()を削除し、whileループの外側に配置しました。これは意図したとおりに動作していますが、これが正しいアプローチであるかどうかはわかりません。

+0

申し訳ありませんが、q.join()ではなくq.task_done() –

関連する問題