2016-12-09 5 views
0

私はマルチスレッドスクリプトでスレッドライブラリを使用しています。私はスレッドでタイムアウトを実装したい。スレッドは、指定された時間後にtask_doneを返されていない場合はこのように、それは機能の出てくるはずです。ここでtask_donepython:スレッドの使用、スレッドタイムアウトの適用

を返す私のコードです:work機能で

def create_workers(): 
    for _ in range(NUMBER_OF_THREADS): 
     t = threading.Thread(target=work) 
     t.daemon = True 
     t.start() 


def create_jobs(): 
    for d in Date_set : 
     queue.put(d) 
    queue.join() 
    scrape() 


def scrape_page(thread_name, page_url): 
    print(thread_name + ' now working on ' + page_url) 
    get_active_urls_perDay(session=s,Date=page_url,County=Cty, courtSystem=CS, PT=P) 


def work(): 
    while True: 
     url = queue.get() 
     scrape_page(threading.current_thread().name, url) 
     Date_set.remove(url) 
     print str(len(Date_set)) + " days more to go!" 
     print "Number of threads active", threading.activeCount() 
     queue.task_done() 


def scrape(): 
    queued_links = Date_set 
    if len(queued_links) > 0: 
     print(str(len(queued_links)) + ' days in the queue') 
     create_jobs() 

、私が欲しいですスレッドのタイムアウトを実装します。 それ以外の場合、コードは正常に実行されますが、返されなかったスレッドはtask_doneでコードを停止し、返されるのを待ちます。

答えて

0
import threading 
import Queue 
import time 

lock = threading.Lock() 

Date_set = ['127.0.0.1/test1', '127.0.0.1/test3', '127.0.0.1/test3', '127.0.0.1/test4'] 
queue = Queue.Queue() 
NUMBER_OF_THREADS = 3 


def create_jobs(): 
    for d in Date_set: 
     queue.put(d) 
    # scrape() 

thread_list = [] 

def create_workers(): 
    for _ in range(NUMBER_OF_THREADS): 
     t = threading.Thread(target=work) 
     thread_list.append(t) 
     t.daemon = True 
     t.start() 


def join_all(): 
    [t.join(5) for t in thread_list] 


def scrape_page(thread_name, page_url): 
    time.sleep(1) 
    lock.acquire() 
    print(thread_name + ' now working on ' + page_url) 
    print page_url + ' done' 
    lock.release() 
    # get_active_urls_perDay(session=s,Date=page_url,County=Cty, courtSystem=CS, PT=P) 


def work(): 
    while True: 
     if queue.empty() is True: 
      break 
     url = queue.get() 
     try: 
      scrape_page(threading.current_thread().name, url) 
      # Date_set.remove(url) 
      lock.acquire() 
      print str(len(Date_set)) + " days more to go!" 
      print "Number of threads active", threading.activeCount() 
      lock.release() 
     finally: 
      queue.task_done() 


def scrape(): 
    queued_links = Date_set 
    if len(queued_links) > 0: 
     print(str(len(queued_links)) + ' days in the queue') 
     create_jobs() 


# s=session 
# Cty= County 
# CS= courtSystem 
# P= PT 
# Date_set = create_dates_set(start_filingDate, end_filingDate) 
create_jobs() 
create_workers() 
join_all() 
print 'main thread quit and all worker thread quit even if it is not finished' 
# scrape() 
# return case_urls 

この例では動作しますが、私はget_active_urls_perDayをシミュレートするために、睡眠(200)を使用し、15秒後に、スクリプトが停止します。 sleep(200)をsleep(1)に置き換えると、すべてのスレッドが終了し、メインスレッドが終了します。

+0

それは働いていますが、1つのスレッドが止まったらすぐにすべてのスレッドとメインプロセスが終了し、コード全体が正常に終了しました... –

+0

ああ!いいえいいえ...あなたのコードは正常に動作しています。ただ1つのスレッドしか停止しませんでしたが、コード全体が一度終了しました。何らかの形でコード全体の終了を止めることはできますか? –

+0

あなたは 'ただ一つのスレッドを止めました 'とはどういう意味ですか?すべての結合がタイムアウトに達すると、コード全体が終了します。 –

0
def create_jobs(): 
    for d in Date_set : 
     queue.put(d) 
    scrape() 

def create_workers(): 
    thread_list=[] 
    for _ in range(NUMBER_OF_THREADS): 
     t = threading.Thread(target=work) 
     thread_list.append(t) 
     t.daemon = True 
     t.start() 
    return thread_list 

def join_all(thread_list): 
    [t.join(5) for t in thread_list] 



def scrape_page(thread_name, page_url): 
    print(thread_name + ' now working on ' + page_url) 
    get_active_urls_perDay(session=s,Date=page_url,County=Cty, courtSystem=CS, PT=P) 


def work(): 
    while True: 
     url = queue.get() 
     try: 
      scrape_page(threading.current_thread().name, url) 
      Date_set.remove(url) 
      print str(len(Date_set)) + " days more to go!" 
      print "Number of threads active", threading.activeCount() 
     finally: 
      queue.task_done() 

def scrape(): 
    queued_links = Date_set 
    if len(queued_links) > 0: 
     print(str(len(queued_links)) + ' days in the queue') 
     create_jobs() 


s=session 
Cty= County 
CS= courtSystem 
P= PT 
Date_set = create_dates_set(start_filingDate, end_filingDate) 
t_list= create_workers() 
join_all(t_list) 
scrape() 
return case_urls 
+0

あなたのコードで 'scrape_page'がハングしますか? –

関連する問題