2016-12-18 8 views
0

デコモジュールが提供する同時実行機能を使用しようとしています。ここでは答えに示すようにコードが....複数のスレッドなしマルチプロセスサブ関数は結果を返しません。

Extract specific columns from a given webpage

を取り組んでいる。しかし、次のコードは、finallistのための任意の要素を返しません。 (それは空です)。 printステートメントから明らかなように、 "slow"の関数スコープ内でいくつかの結果を返します。しかし、外側のリストはなぜ空であるのですか?

import urllib.request 
from bs4 import BeautifulSoup 
from deco import concurrent, synchronized 

finallist=list() 
urllist=list() 

@concurrent 
def slow(url): 
    #print (url) 
    try: 
     page = urllib.request.urlopen(url).read() 
     soup = BeautifulSoup(page) 
     mylist=list() 
     for anchor in soup.find_all('div', {'class':'col-xs-8'})[:9]: 
      mylist.append(anchor.text) 
      urllist.append(url) 
     finallist.append(mylist) 
     #print (mylist) 
     print (finallist) 
    except: 
     pass 


@synchronized 
def run(): 
    finallist=list() 
    urllist=list() 
    for i in range(10): 
     url='https://pythonexpress.in/workshop/'+str(i).zfill(3) 
     print (url) 
     slow(url) 
    slow.wait() 

答えて

1

私はモジュールで動作するようにコードをリファクタリングしました。角括弧の操作ですべてを行い、グローバル変数

  • を使用しないでください

    1. :私はcommon pitfalls outlined on the deco wikiの2を固定OBJ [キー] =値

    は、ここでの結果です:

    import urllib 
    from bs4 import BeautifulSoup 
    from deco import concurrent, synchronized 
    
    N = 10 
    
    @concurrent 
    def slow(url): 
        try: 
         page = urllib.urlopen(url).read() 
         soup = BeautifulSoup(page, "html.parser") 
         mylist=list() 
         for anchor in soup.find_all('div', {'class':'col-xs-8'})[:9]: 
          mylist.append(anchor.text) 
         return mylist 
        except: 
         pass 
    
    @synchronized 
    def run(): 
        finallist=[None] * N 
        urllist = ['https://pythonexpress.in/workshop/'+str(i).zfill(3) for i in range(N)] 
        for i, url in enumerate(urllist): 
         print (url) 
         finallist[i] = slow(url) 
        return finallist 
    
    if __name__ == "__main__": 
        finallist = run() 
        print(finallist) 
    
  • 関連する問題