2016-10-06 4 views
0

bekam eine Spinne, die auf eine Datenbank zu kriechen und fügen Sie versucht, und dachte, ich threading verwenden würde die Dinge ein wenigPython Threading, Liste von 10 Links genommen als 10 Positionsargumente

hier zu beschleunigen bis der Code :

def final_function(link_set): 
    root = 'http://www.rightmove.co.uk' 
    pages = [] 

    for link in link_set: 


     try: 
      links = forty_page_getter(link) 
      pages.append(links) 
     except: 
      print('not possible for:' + str(link)) 
      pass 
    flattened = [item for sublist in pages for item in sublist] 
    print('flattened done') 

    for page in flattened: 
     print(len(flattened)) 
     try: 
      page_stripper(link=(root+page)) 
     except: 
      print('couldnt do it for') 
      pass 

so das ist die letzte Funktion, die eine Liste von Links als ein Argument aufnimmt. Mein Problem ist hier:

if __name__ == "__main__": 

    areas = pd.read_csv('postcodes.csv') 
    areas = areas['0'] 
    result_list = split_list(flattened=areas, chunk_size=10) 
    threads = [] 
    outer_count = 1 


    # here ten postcode links 
    for i in result_list: 
     print('Started thread No. ' + str(outer_count)) 
     t = threading.Thread(target=final_function, args=i) 
     threads.append(t) 
     t.start() 
     outer_count += 1 

i eine Unterliste von Links, von dem aus ich Gehäusedaten bekommen, seine Länge zehn ist, weshalb ich eine Ausnahme

Exception in thread Thread-1: 
Traceback (most recent call last): 
    File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/threading.py", line 914, in _bootstrap_inner 
    self.run() 
    File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/threading.py", line 862, in run 
    self._target(*self._args, **self._kwargs) 
TypeError: final_function() takes 1 positional argument but 10 were given 

bekommen ist es trotzdem Ich könnte das überspringen? Im stecken die Ideen aus, wie ich einfach dachte beiläufig, dass als Argument würde

EDIT Sinn ergeben: behobenes mich, ich weiß nicht, warum, aber alles, was Sie tun müssen, ist

t = threading.Thread(target=final_function, args=(i,)) 

, die es löst

Antwort

2

args in threading.Thread soll ein Tupel von Argumenten sein, was bedeutet, dass wenn Sie iterable (list) daran übergeben, es jedes Listenelement als separates Argument betrachtet.

Es kann, indem Tupel, mit einer Liste vermieden werden, um args, wie

for i in result_list: 
    t = threading.Thread(target=final_function, args=(i,))