[英]How to control parallel processes with condition
我想控制我的進程,而我沒有找到工作 url。
但是我有NameError: name 'status' is not defined
由於線程沒有等待聲明一個變量
import requests
from multiprocessing import Process
def first_function(i):
global status
status = False
try:
response = requests.get(f'https://ru.hexlet.io/{i}')
if response.status_code == 200:
status = True
except Exception as e:
print(str(e))
def second_function():
for i in [1,2,3,4,5,6,'courses',8,9,10]:
Process(target=first_function, args=(i, )).start()
print(i)
if status:
print('working', i)
break
if __name__ == '__main__':
second_function()
我建議使用multiprocessing.pool.Pool
來限制同時運行的進程數(因為您已經指出它們可能非常多)。
如果你使用它的apply_async()
方法向它“提交”任務,你可以使用可選的callback
參數來指定一個 function,只要其中一個子進程完成,就會調用它。 這提供了一種方法來終止提交到pool
的其他進程的進一步處理。
import multiprocessing as mp
import requests
def worker(i):
try:
response = requests.get(f'https://ru.hexlet.io/{i}')
if response.status_code == 200:
return i
except Exception as exc:
print(f'{i!r} caused {exc}')
return None
if __name__ == '__main__':
def notify(i):
"""Called when a Pool worker process finishes execution."""
if i is not None:
print(f'{i!r} worked')
pool.terminate() # Stops worker processes immediately.
pool = mp.Pool()
for i in [1,2,3,4,5,6,'courses',8,9,10]:
pool.apply_async(worker, (i,), callback=notify)
pool.close()
pool.join()
print('fini')
Output:
'courses' worked
fini
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.