នៅពេលខ្សែជាច្រើនចែករំលែកអាងប្រូកស៊ីតូចមួយ ការជ្រើសរើសធាតុដោយចៃដន្យអាចផ្តល់ប្រូកស៊ីដូចគ្នាដល់ប្រតិបត្តិការសកម្មពីរ។ ជួរអាចផ្ទុកធាតុដែលមានសម្រាប់ខ្ចីនៅពេលនេះ៖

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)

សាងសង់ជួរម្តង មុនពេលចាប់ផ្តើមខ្សែកម្មករ។ proxy_urls មាន URL ចំណុចបញ្ចប់ពេញលេញ។ បេក្ខជនសាធារណៈមាននៅក្នុងបញ្ជីប្រូកស៊ីឥតគិតថ្លៃ។ ប្រើពិធីការ និងទម្រង់ URL ដែល fetch_one គាំទ្រ។ អនុគមន៍ fetch_one សមកាលកម្មដែលមានស្រាប់ត្រូវបញ្ចប់ប្រតិបត្តិការបណ្តាញ និងបិទការឆ្លើយតបណាមួយ មុនពេលវិលត្រឡប់។ បើមិនដូច្នេះទេ ការជួលនឹងបញ្ចប់ខណៈការតភ្ជាប់នៅតែប្រើប្រូកស៊ីនោះ។

Queue.get ដកធាតុមួយដែលមានចេញដោយអាតូមិក។ អាងដែលអស់ហើយរង់ចាំ ជាជាងស្កេនទង់រួមម្តងហើយម្តងទៀត។ ប្រសិនបើគ្មានធាតុមកដល់ក្នុងរយៈពេលប្រាំវិនាទី queue.Empty ឈានដល់អ្នកហៅ។ ជ្រើសរើសគោលនយោបាយព្យាយាមឡើងវិញ បរាជ័យ ឬបោះបង់របស់កម្មវិធីសម្រាប់លទ្ធផលនោះ។

ប្លុក finally ប្រគល់ធាតុដែលទទួលបានវិញ បន្ទាប់ពីជោគជ័យ ឬករណីលើកលែង។ វាមិនប្រកាសថាចំណុចបញ្ចប់ដែលបរាជ័យមានសុខភាពល្អទេ។ គោលនយោបាយដាក់ដោះដាក់ ជំនួស និងត្រជាក់ត្រូវការផ្លូវច្បាស់លាស់ ជាជាងបោះចោលស្ងាត់ៗនូវប្រូកស៊ីនីមួយៗដែលឃើញកំហុសបណ្តោះអាសន្ន។

ការលុបភាពស្ទួននៃខ្សែ URL ដូចគ្នាការពារធាតុជួរស្ទួន។ URL ផ្សេងគ្នានៅតែអាចសំដៅទៅប្រូកស៊ីរូបវន្តដូចគ្នា ឬច្រកចេញ។ ដាក់ជាក្រុមដោយចេតនា ប្រសិនបើភាពផ្តាច់មុខត្រូវអនុវត្តលើធនធានរួមនោះ។ ជួរសម្របសម្រួលខ្សែក្នុងដំណើរការនេះ មិនមែនកម្មករនៅម៉ាស៊ីនផ្សេងទេ។

អត្ថបទពាក់ព័ន្ធ