queue ਨਾਲ Python ਥ੍ਰੈਡਾਂ ਵਿਚਕਾਰ ਪ੍ਰੌਕਸੀ ਪੂਲ ਸਾਂਝਾ ਕਰੋ
ਸਿੰਕ੍ਰੋਨਾਈਜ਼ਡ queue ਅਤੇ finally ਬਲਾਕ ਵਰਤ ਕੇ ਸਿੰਕ੍ਰੋਨਸ ਥ੍ਰੈਡਿਡ ਓਪਰੇਸ਼ਨ ਲਈ ਇੱਕ ਪ੍ਰੌਕਸੀ ਰਾਖਵੀਂ ਰੱਖੋ ਅਤੇ ਬਾਅਦ ਵਿੱਚ ਵਾਪਸ ਕਰੋ।
ਜਦੋਂ ਕਈ ਥ੍ਰੈਡ ਇੱਕ ਛੋਟਾ ਪ੍ਰੌਕਸੀ ਪੂਲ ਸਾਂਝਾ ਕਰਦੇ ਹਨ, ਤਾਂ ਬੇਤਰਤੀਬ ਐਂਟਰੀ ਚੁਣਨ ਨਾਲ ਦੋ ਸਰਗਰਮ ਓਪਰੇਸ਼ਨਾਂ ਨੂੰ ਇੱਕੋ ਪ੍ਰੌਕਸੀ ਮਿਲ ਸਕਦੀ ਹੈ। queue ਮੌਜੂਦਾ ਸਮੇਂ ਉਧਾਰ ਲੈਣ ਲਈ ਉਪਲਬਧ ਐਂਟਰੀਆਂ ਰੱਖ ਸਕਦੀ ਹੈ:
from contextlib import contextmanager
from queue import Queue
available = Queue()
for endpoint in dict.fromkeys(proxy_urls):
available.put(endpoint)
@contextmanager
def borrow_proxy():
endpoint = available.get(timeout=5)
try:
yield endpoint
finally:
available.put(endpoint)
def process_url(url):
with borrow_proxy() as endpoint:
return fetch_one(url, endpoint)
ਵਰਕਰ ਥ੍ਰੈਡ ਸ਼ੁਰੂ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ queue ਇੱਕ ਵਾਰ ਬਣਾਓ। proxy_urls ਵਿੱਚ ਪੂਰੇ endpoint URL ਹਨ। ਜਨਤਕ ਉਮੀਦਵਾਰ ਮੁਫ਼ਤ ਪ੍ਰੌਕਸੀ ਸੂਚੀ ਵਿੱਚ ਉਪਲਬਧ ਹਨ; fetch_one ਵੱਲੋਂ ਸਮਰਥਿਤ ਪ੍ਰੋਟੋਕੋਲ ਅਤੇ URL ਫਾਰਮੈਟ ਵਰਤੋ। ਮੌਜੂਦਾ ਸਿੰਕ੍ਰੋਨਸ fetch_one ਫੰਕਸ਼ਨ ਨੂੰ ਵਾਪਸ ਆਉਣ ਤੋਂ ਪਹਿਲਾਂ ਆਪਣਾ ਨੈੱਟਵਰਕ ਓਪਰੇਸ਼ਨ ਪੂਰਾ ਕਰਕੇ ਕੋਈ ਵੀ ਜਵਾਬ ਬੰਦ ਕਰਨਾ ਚਾਹੀਦਾ ਹੈ। ਨਹੀਂ ਤਾਂ ਕਨੈਕਸ਼ਨ ਵੱਲੋਂ ਅਜੇ ਵੀ ਉਹ ਪ੍ਰੌਕਸੀ ਵਰਤੇ ਜਾਣ ਸਮੇਂ ਲੀਜ਼ ਖਤਮ ਹੋ ਜਾਵੇਗੀ।
Queue.get ਇੱਕ ਉਪਲਬਧ ਐਂਟਰੀ ਨੂੰ ਪਰਮਾਣੂ ਰੂਪ ਵਿੱਚ ਹਟਾਉਂਦਾ ਹੈ। ਖਤਮ ਹੋਇਆ ਪੂਲ ਵਾਰ-ਵਾਰ ਸਾਂਝੇ ਫਲੈਗ ਸਕੈਨ ਕਰਨ ਦੀ ਬਜਾਏ ਉਡੀਕ ਕਰਦਾ ਹੈ। ਜੇ ਪੰਜ ਸਕਿੰਟਾਂ ਵਿੱਚ ਕੋਈ ਐਂਟਰੀ ਨਹੀਂ ਆਉਂਦੀ, ਤਾਂ queue.Empty ਕਾਲਰ ਤੱਕ ਪਹੁੰਚਦੀ ਹੈ; ਉਸ ਨਤੀਜੇ ਲਈ ਐਪਲੀਕੇਸ਼ਨ ਦੀ ਮੁੜ-ਕੋਸ਼ਿਸ਼, ਅਸਫਲਤਾ ਜਾਂ ਰੱਦ ਕਰਨ ਦੀ ਨੀਤੀ ਚੁਣੋ।
finally ਬਲਾਕ ਸਫਲਤਾ ਜਾਂ ਅਪਵਾਦ ਤੋਂ ਬਾਅਦ ਪ੍ਰਾਪਤ ਕੀਤੀ ਐਂਟਰੀ ਵਾਪਸ ਕਰਦਾ ਹੈ। ਇਹ ਘੋਸ਼ਣਾ ਨਹੀਂ ਕਰਦਾ ਕਿ ਅਸਫਲ endpoint ਸਿਹਤਮੰਦ ਹੈ। ਕੁਆਰੰਟੀਨ, ਬਦਲੀ ਅਤੇ ਕੂਲਡਾਊਨ ਨੀਤੀਆਂ ਲਈ ਸਪਸ਼ਟ ਰਾਹ ਲੋੜੀਂਦਾ ਹੈ, ਅਸਥਾਈ ਤਰੁੱਟੀ ਦੇਖਣ ਵਾਲੀ ਹਰ ਪ੍ਰੌਕਸੀ ਨੂੰ ਚੁੱਪਚਾਪ ਸੁੱਟਣ ਦੀ ਬਜਾਏ।
ਇੱਕੋ URL ਸਤਰਾਂ ਦੀ ਨਕਲ ਹਟਾਉਣਾ queue ਵਿੱਚ ਦੁੱਗਣੀਆਂ ਐਂਟਰੀਆਂ ਰੋਕਦਾ ਹੈ। ਵੱਖਰੇ URL ਅਜੇ ਵੀ ਇੱਕੋ ਭੌਤਿਕ ਪ੍ਰੌਕਸੀ ਜਾਂ ਐਗਜ਼ਿਟ ਵੱਲ ਇਸ਼ਾਰਾ ਕਰ ਸਕਦੇ ਹਨ; ਜੇ ਉਸ ਸਾਂਝੇ ਸਰੋਤ ਉੱਤੇ ਵਿਸ਼ੇਸ਼ ਅਧਿਕਾਰ ਲਾਗੂ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ ਤਾਂ ਉਹਨਾਂ ਨੂੰ ਜਾਣਬੁੱਝ ਕੇ ਸਮੂਹਬੱਧ ਕਰੋ। queue ਇਸ ਪ੍ਰਕਿਰਿਆ ਵਿੱਚ ਥ੍ਰੈਡਾਂ ਦਾ ਤਾਲਮੇਲ ਕਰਦੀ ਹੈ, ਹੋਰ ਮਸ਼ੀਨਾਂ ਦੇ ਵਰਕਰਾਂ ਦਾ ਨਹੀਂ।