2014-02-17 3 views
0

У меня есть большое количество функций, и каждый из них должен загружать URL-адрес из списка и выполнять некоторые операции. Мне нужно, чтобы все функции выполнялись параллельно, если это возможно, и каждая функция должна параллельно загружать URL-адреса из списка. У меня есть код здесь, но я не уверен, что он делает то, что я сделал, или это можно сделать проще? Спасибовыполнять несколько функций параллельно

class Multi(object): 


    #---------------------------------------------------------------------- 
    def __init__(self, urls_func1, urls_func2): 
     """ Initialize class with list of urls """ 
     self.urls_func1 = urls_func1 
     self.urls_func2 = urls_func2 
    #---------------------------------------------------------------------- 
    def func1(self, url, que): 
     "do something" 
     que.put(result_func1) 

    #---------------------------------------------------------------------- 
    def func2(self, url, que): 
     "do something" 
     que.put(result_func2) 

    #----------------------------------------------------------------------  
    def run(self): 

     "For func1" 
     jobs = [] 
     queue1=[]   
     for url in urls_func1: 
      queue1.append(Queue()) 
      process = multiprocessing.Process(target=self.func1, args=(url,queue1[len(jobs)],)) 
      jobs.append(process) 
      process.start() 
     for job in jobs: 
      job.join() 

     "For func2" 
     jobs = [] 
     queue2=[]  
     for url in urls_func1: 
      queue2.append(Queue()) 
      process = multiprocessing.Process(target=self.func2, args=(url,queue2[len(jobs)],)) 
      jobs.append(process) 
      process.start() 
     for job in jobs: 
      job.join() 



     return result_func1, result_func2 

    #---------------------------------------------------------------------- 


if __name__ == "__main__": 

    urls_for_func1=['www.google.com', 'www.google.com', 'www.google.com', 'www.google.com'] 
    urls_for_func2=['www.google.com', 'www.google.com', 'www.google.com'] 
    a,b=(Multi(urls_for_func1, urls_for_func2).run()) 

EDIT: Коррекция имен переменных

+0

«Я не уверен, если это то, что я metioned [так в оригинале]»? Вы даже пробовали? – jonrsharpe

+0

Это работает, конечно, просто работает ли она параллельно? – Jovan

+0

у кого есть предложение? – Jovan

ответ

1

Вы можете загрузить несколько адресов одновременно, ограничивая при этом общее количество параллельных заданий с использованием пула потоков:

from multiprocessing.dummy import Pool # use threads 

def func1(url): 
    # download url here 
    return url, "result", None 

def func2(url): 
    # do something with the url unsuccessfully 
    return url, None, "describe the error" 

pool = Pool(20) # no more than 20 concurrent connections 
results_for_func1 = pool.map(func1, urls_func1) # it blocks until done 
results_for_func2 = pool.map(func2, urls_func2) 
+0

Сабастьян, не могли бы вы рассказать мне, что мне делать, если я хочу (например), обе функции выполняют параллель? Давайте скажем, что они свободно раскрывают список URL-адресов? Спасибо за код – Jovan

+0

@Jovan: 'async_result = pool.map_async (f, args)' немедленно возвращается. Чтобы получить результат позже: 'r = async_result.get()'. – jfs

+0

@Sabastian: этот pool.map просто отлично, mabye, я его не понял, предлагаете ли вы мне использовать pool.map_async (f, args) для функций? Этот пример просто замечательный, но еще немного, если его возможно ... Как запускать функции параллельно? Этот код выполняет одну функцию несколько раз (параллельно) для списка аргументов ... Как это происходит с функциями? Большое спасибо. – Jovan

0

Вам не нужно multiprocessing, потому что ваша рабочая нагрузка связана с сетью.

threading легче и масштабируется лучше, до тысяч (оперативная память/8 МБ).

Если вам нужно больше масштаб, чем это, используйте greenlet (легко) или крученые (хардкор)

+0

Можете ли вы добавить пример кода, пожалуйста? – Jovan

Смежные вопросы