viking_unet

ThreadPoolExecutor using

Apr 26th, 2021 (edited)
339
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.39 KB | None | 0 0
  1. """
  2. Пример использования запуска простого асинхронного пуллера тасков.
  3. Может работать как на потоках, так и на процессах.
  4.  
  5. На основе примеров в официальной документации
  6. https://docs.python.org/3/library/concurrent.futures.html
  7.  
  8. И на основе статьи
  9. https://dev-gang.ru/article/kak-sdelat-kod-python-parallelnym-s-pomosczu-3h-strok-x32tjod5s6/
  10. """
  11.  
  12. import concurrent.futures
  13. import urllib.request
  14. import time
  15. import datetime
  16.  
  17. URLS = ['http://www.foxnews.com/',
  18.         'http://www.cnn.com/',
  19.         'http://www.bbc.com/',
  20.         'http://www.nytimes.com/',
  21.         'https://echo.msk.ru/',
  22.         'https://nat-geo.ru/',
  23.         ]
  24.  
  25. # Supprot function to print current time for debug print
  26. def dt_now(): return datetime.datetime.now().strftime('%H:%M:%S.%f')
  27.  
  28. # Retrieve a single page and report the URL and contents
  29. def load_url(url, timeout):
  30.     time.sleep(0.001)
  31.     print(f'[{dt_now()}] start load_url {url}')
  32.     t1 = time.monotonic()
  33.     with urllib.request.urlopen(url, timeout=timeout) as conn:
  34.         res = conn.read()
  35.         t2 = time.monotonic()
  36.         print(f'[{dt_now()}] load_url delta {round(t2-t1, 2)}s url {url}')
  37.         return res
  38.  
  39. def main(PoolExecutor, max_workers=1):
  40.  
  41.     t1 = time.monotonic()
  42.     if PoolExecutor:
  43.         executor_name = PoolExecutor.__name__
  44.     else:
  45.         executor_name = 'without pooling'
  46.     print(f'{executor_name} start main function:')
  47.    
  48.     if PoolExecutor:
  49.         # We can use a with statement to ensure threads are cleaned up promptly
  50.         with PoolExecutor(max_workers=max_workers) as executor:
  51.             # Start the load operations and mark each future with its URL
  52.             future_to_url = {time.sleep(0.001) or executor.submit(load_url, url, 60): url for url in URLS}
  53.             for future in concurrent.futures.as_completed(future_to_url):
  54.                 url = future_to_url[future]
  55.                 try:
  56.                     data = future.result()
  57.                 except Exception as exc:
  58.                     print(f'[{dt_now()}] {url} generated an exception: {exc}')
  59.                 else:
  60.                     print(f'[{dt_now()}] {url} page is {len(data)} bytes')
  61.     else:
  62.         for url in URLS:
  63.             try:
  64.                 time.sleep(0.001)
  65.                 data = load_url(url, 60)
  66.             except Exception as exc:
  67.                 print(f'[{dt_now()}] {url} generated an exception: {exc}')
  68.             else:
  69.                 print(f'[{dt_now()}] {url} page is {len(data)} bytes')
  70.        
  71.     t2 = time.monotonic()
  72.     print(f'{executor_name} total executing time {round(t2-t1, 2)}s for max_workers {max_workers}')
  73.  
  74. if __name__ == '__main__':
  75.    
  76.     # запуск для сравнения параллельной работы пуллера потоков и пуллера процессов
  77.     # * пуллер процессов будет быстрее, если в задачах будет преобладать использование CPU
  78.     # * пуллер потоков будет одинаково работать, но тратить меньше ресурсов, если в задачах преобладает ожидание ввода/вывода
  79.    
  80.     # запуск в обычном синхронном режиме
  81.     main(None)
  82.     print()
  83.     max_workers = 6
  84.     # запуск в асинхронном режиме с использованием воркеров-потоков
  85.     main(concurrent.futures.ThreadPoolExecutor, max_workers)
  86.     print()
  87.     # запуск в асинхронном режиме с использованием воркеров-процессов
  88.     main(concurrent.futures.ProcessPoolExecutor, max_workers)
  89.  
  90. # run statisitc #
  91.  
  92. """
  93.  
  94. without pooling start main function:
  95. [11:00:24.075816] start load_url http://www.foxnews.com/
  96. [11:00:30.107250] load_url delta 6.03s url http://www.foxnews.com/
  97. [11:00:30.107250] http://www.foxnews.com/ page is 277709 bytes
  98. [11:00:30.111428] start load_url http://www.cnn.com/
  99. [11:00:45.122152] load_url delta 15.02s url http://www.cnn.com/
  100. [11:00:45.122152] http://www.cnn.com/ page is 1115841 bytes
  101. [11:00:45.124163] start load_url http://www.bbc.com/
  102. [11:00:55.071005] load_url delta 9.95s url http://www.bbc.com/
  103. [11:00:55.071962] http://www.bbc.com/ page is 296305 bytes
  104. [11:00:55.075136] start load_url http://www.nytimes.com/
  105. [11:01:11.237171] load_url delta 16.16s url http://www.nytimes.com/
  106. [11:01:11.237171] http://www.nytimes.com/ page is 1467771 bytes
  107. [11:01:11.240182] start load_url https://echo.msk.ru/
  108. [11:01:16.486315] load_url delta 5.23s url https://echo.msk.ru/
  109. [11:01:16.486315] https://echo.msk.ru/ page is 226628 bytes
  110. [11:01:16.488317] start load_url https://nat-geo.ru/
  111. [11:01:21.548233] load_url delta 5.06s url https://nat-geo.ru/
  112. [11:01:21.548233] https://nat-geo.ru/ page is 100076 bytes
  113. without pooling total executing time 57.47s for max_workers 1
  114.  
  115. ThreadPoolExecutor start main function:
  116. [11:01:21.555370] start load_url http://www.foxnews.com/
  117. [11:01:21.556191] start load_url http://www.cnn.com/
  118. [11:01:21.558191] start load_url http://www.bbc.com/
  119. [11:01:21.560231] start load_url http://www.nytimes.com/
  120. [11:01:21.561238] start load_url https://echo.msk.ru/
  121. [11:01:21.562226] start load_url https://nat-geo.ru/
  122. [11:01:22.293995] load_url delta 0.73s url https://nat-geo.ru/
  123. [11:01:22.293995] https://nat-geo.ru/ page is 100076 bytes
  124. [11:01:22.554456] load_url delta 1.0s url http://www.foxnews.com/
  125. [11:01:22.554456] http://www.foxnews.com/ page is 277709 bytes
  126. [11:01:26.920251] load_url delta 5.36s url https://echo.msk.ru/
  127. [11:01:26.920251] https://echo.msk.ru/ page is 226628 bytes
  128. [11:01:31.675108] load_url delta 10.11s url http://www.nytimes.com/
  129. [11:01:31.675108] http://www.nytimes.com/ page is 1467771 bytes
  130. [11:01:31.796914] load_url delta 10.23s url http://www.bbc.com/
  131. [11:01:31.796914] http://www.bbc.com/ page is 296305 bytes
  132. [11:01:36.444974] load_url delta 14.89s url http://www.cnn.com/
  133. [11:01:36.444974] http://www.cnn.com/ page is 1115841 bytes
  134. ThreadPoolExecutor total executing time 14.91s for max_workers 6
  135.  
  136. ProcessPoolExecutor start main function:
  137. [11:01:36.678976] start load_url http://www.foxnews.com/
  138. [11:01:36.690976] start load_url http://www.cnn.com/
  139. [11:01:36.700976] start load_url http://www.bbc.com/
  140. [11:01:36.717975] start load_url http://www.nytimes.com/
  141. [11:01:36.723975] start load_url https://echo.msk.ru/
  142. [11:01:36.740981] start load_url https://nat-geo.ru/
  143. [11:01:37.090603] load_url delta 0.34s url https://nat-geo.ru/
  144. [11:01:37.091604] https://nat-geo.ru/ page is 100076 bytes
  145. [11:01:37.144602] load_url delta 0.45s url http://www.foxnews.com/
  146. [11:01:37.146611] http://www.foxnews.com/ page is 277708 bytes
  147. [11:01:41.545505] load_url delta 4.83s url https://echo.msk.ru/
  148. [11:01:41.545505] https://echo.msk.ru/ page is 226731 bytes
  149. [11:01:46.635736] load_url delta 9.94s url http://www.bbc.com/
  150. [11:01:46.636737] http://www.bbc.com/ page is 296253 bytes
  151. [11:01:47.506517] load_url delta 10.8s url http://www.nytimes.com/
  152. [11:01:47.510517] http://www.nytimes.com/ page is 1468270 bytes
  153. [11:01:51.169220] load_url delta 14.48s url http://www.cnn.com/
  154. [11:01:51.172221] http://www.cnn.com/ page is 1115841 bytes
  155. ProcessPoolExecutor total executing time 14.77s for max_workers 6
  156.  
  157. """
Add Comment
Please, Sign In to add comment