Как сделать ie выполнение одного процесса другому внутри al oop in Python - PullRequest
0 голосов
/ 11 июля 2020

Как я могу поддерживать работу al oop, когда некоторые процессы ждут других внутри l oop? (см. приведенный ниже код для пояснения, имеет смысл объяснить в коде)

for i in range(0, len(my_list), batch_size):
    current_batch = my_list[i:i+batch_size]
    download_processes = [Popen('do stuff')] # NOT ACTUAL CODE. This downloads files.
    _ = [p.wait() for p in download_processes] # wait until all files above download before executing the code below 

    more_processes = [Popen('do stuff')] # NOT ACTUAL CODE. This zips the downloaded files
    # execute yet more processes (that process the zips files) when "more_processes" end, but keep the loop going to start downloading more files

Ответы [ 2 ]

0 голосов
/ 11 июля 2020
  1. Создать пул

  2. Использовать l oop внутри пула для партии

  3. Использовать result = pool .map_asyn c () с вашим целевым методом

4. Выполните result.get (timeout) или result.wait ()

Если вы получили тайм-аут или после того, как ваше условие выполнено, вернитесь и выйдите из while l oop и pool.close, завершите работу и затем присоединитесь.

def process_url(url):
  # call url and process data
  
  pass

def pool_handler():
    with Pool() as p:
     for i in range(0, len(my_list), batch_size):
      current_batch_urls = my_list[i:i+batch_size]
    
      # this will create processes and process url
      r = p.map_async(process_url, current_batch_urls)
      r. wait()#wait for each batch

   #outside loop 
    p.close()
    p.join()#wait until all processes are done

if __name__ == '__main__':
    pool_handler()


0 голосов
/ 11 июля 2020

Вы можете использовать модуль multiprocessing для достижения этого

from multiprocessing import Pool
import time, requests

urls = ["file_url1","file_url2","file_url3"]


def download_file(url):
    return requests.get(url).content.strip()

def process_url(url):
    file_content = download_file(url)
    # Process File content 

def pool_handler():
    p = Pool(2)
    p.map(process_url, urls)

if __name__ == '__main__':
    pool_handler()
...