2016-06-13 1 views
-1

グローバルリスト変数にtry/except例外の新しい単語を追加しようとしていますが、try/exceptの後に空リストを取得します。Pythonでtry/except例外にグローバルリスト変数を追加する方法は?

list = []        # created empty list with global scope 
    def try_multiple_operations(j): 
      try: 
       jopen = urllib2.urlopen(j) # opened url for parsing content 
       versions = jopen.read() # read and save to variable 
       version = pq(versions)  # filtering content with pyquery 
       ....      # pyquery operations 
       list.append(version) 
      except urllib2.URLError:  # urllib2 exception 
       list.append('0.0') 
      except urllib2.HTTPError:  # urllib2 exception 
       list.append('0.0') 
executor = concurrent.futures.ProcessPoolExecutor(5) 
futures = [executor.submit(try_multiple_operations, j) for j in list] 
concurrent.futures.wait(futures) 
print len(list)      # 0 elements 

最後に空のリストを取得しました。 try/except内のグローバルリストに新しい結果を追加/追加するにはどうしたらいいですか?

+0

に変更することができ、あなたは関数を実行しましたか? – user2357112

+0

関数を実行してみてください。 – kmad1729

+0

申し訳ありませんが、私はコードを更新しました。私はもう一度試しましたが、変更はありません。 – user2993877

答えて

2

いくつかの問題があります。まず、listは(あなたがビルトインlist機能をシャドウしないように、実際に名前を変更する必要があります)空であるので、

futures = [executor.submit(try_multiple_operations, j) for j in list] 

あなたの関数のゼロ回を実行します。

もう1つは、ProcessPoolExecutorが別のプロセスでワーカーを実行することです。作業者は、メインプロセスのプロセスではなく、プロセスのlistをグローバルに更新します。 mapのような他のプールメソッドの1つを使用し、ワーカーに結果を返させる必要があります。

あなたのコードが実行可能ではないので、私は

import concurrent.futures 

def try_multiple_operations(j): 
    try: 
     if j % 2: 
      raise ValueError('oops') 
     return '%d even' % j 
    except ValueError: 
     return '%d odd' % j 

executor = concurrent.futures.ProcessPoolExecutor(5) 
my_list = list(executor.map(try_multiple_operations, range(10))) 
print(my_list) 

異なる実施例を調理し、コードは

def try_multiple_operations(j): 
     try: 
      jopen = urllib2.urlopen(j) # opened url for parsing content 
      versions = jopen.read() # read and save to variable 
      version = pq(versions)  # filtering content with pyquery 
      ....      # pyquery operations 
      return version 
     except urllib2.URLError:  # urllib2 exception 
      return '0.0' 
     except urllib2.HTTPError:  # urllib2 exception 
      return '0.0' 

url_list = [ ...something... ] 
executor = concurrent.futures.ProcessPoolExecutor(5) 
my_list = list(executor.map(try_multiple_operations, url_list) 
print len(my_list)      # 0 elements 
関連する問題