استخدام حزمة SDK المتزامنة لـ Python من asyncio

بقلم solvethreeمدة القراءة: 3 دقيقة

استخدم asyncio.to_thread لتشغيل الطريقة المتزامنة Solvethree.solve دون حجب حلقة الأحداث لديك. أحط عملية نقل التنفيذ بإشارة سمافور، وأنشئ عميلًا منفصلًا داخل كل استدعاء للعامل. لا تتضمن حزمة SDK عميلًا غير متزامن أصليًا؛ وتظل طلباتها واستطلاعها يعملان بشكل متزامن داخل الخيط.

في هذه الصفحة

تحديد حجم العمل وضبط مهلة حزمة SDK

يتطلب المثال Python 3.10+ وحزمة SDK الرسمية لـ Python. اضبط SOLVETHREE_API_KEY وSOLVETHREE_PROXY في بيئة الخادم. استبدل accounts.example.com وlogin باسم المضيف والإجراء المستهدفين. يجب أن يكون للموقع ملف تعريف نشط متاح لمساحة عملك مسبقًا؛ راجع إعداد ملف تعريف الموقع.

asyncio · وضع حدود لعمل SDK المتزامن
import asyncio
import os
import uuid
from solvethree import Solvethree

async def main():
    limit = asyncio.Semaphore(4)
    async def solve_one(number):
        task = {"site": "accounts.example.com", "action": "login", "proxy": os.environ["SOLVETHREE_PROXY"], "requestId": str(uuid.uuid4())}
        def blocking_solve():
            return Solvethree(os.environ["SOLVETHREE_API_KEY"]).solve(task, timeout=180)
        async with limit:
            try:
                result = await asyncio.to_thread(blocking_solve)
                print("Ready task:", result["id"])
                # Submit the solution now with its proxy and browser identity.
            except Exception as error:
                print("Job", number, "requestId", task["requestId"], "error class", type(error).__name__)
                # Retain task and inspect SDK recovery IDs before restarting it.
    await asyncio.gather(*(solve_one(number) for number in range(8)))

asyncio.run(main())
# Canceling an await does not stop an already-running thread or remote task.
  • تسمح إشارة السمافور بتشغيل أربع عمليات في الوقت نفسه من أصل الثماني المرسلة إلى gather. العمليات التي تنتظر مكانًا لم تبدأ بعد استدعاء حزمة SDK.
  • ينشئ كل عامل عميل Solvethree خاصًا به بدلًا من مشاركة عميل واحد بين الخيوط.
  • يحدد timeout=180 في حزمة SDK مهلة الحل. ولا يشمل الوقت المستغرق في انتظار إشارة السمافور. مهلة asyncio المحيطة بعملية الانتظار ليست بديلًا عن مهلة حزمة SDK هذه.
  • تُنشأ المهمة وrequestId الخاص بها قبل الدخول إلى العامل. احتفظ بكليهما متاحين للاسترداد بدلًا من إنشاء معرّف بديل كلما حدث خطأ.

تنشئ حزمة SDK المهمة مرة واحدة وتستطلع حالتها حتى تصبح جاهزة أو تطرح خطأ. لا تحتاج إلى كتابة حلقة استطلاع ثانية حول solve.

الإلغاء لا يوقف العامل أو المهمة البعيدة

إلغاء الروتين المساعد الذي ينتظر to_thread لا يوقف خيطًا بدأ العمل بالفعل ولا يلغي عملية الحل البعيدة. معالج الاستثناءات العادي في المثال ليس آلية تنظيف عند الإلغاء.

يؤثر هذا أيضًا في حد التزامن: قد يحرر الإلغاء إشارة السمافور بينما يواصل العامل عمله. وإذا سمحت فورًا بدخول عمليات بديلة، فقد يظل أكثر من أربعة استدعاءات لحزمة SDK نشطًا. إذا كنت تحتاج إلى حد صارم أثناء الإلغاء، فتتبّع العمال الذين لم ينتهوا وأبقِ السعة المخصصة لهم مشغولة حتى ينتهوا.

للاستخدام في بيئة الإنتاج، احتفظ بمدخلات المهمة نفسها تمامًا ومعرّف الطلب في مكان يمكن لمسار الاسترداد الوصول إليه بعد خروج الروتين المساعد. انتهاء المهلة يعني أنك توقفت عن تلقي نتيجة، ولا يعني بالضرورة فشل إنشاء المهمة.

  1. 1.

    استرداد مهمة معروفة

    افحص task_id وrequest_id في خطأ حزمة SDK لـ Python. إذا كان لديك معرّف مهمة، فاستأنف الاسترجاع باستخدام get_task بدلًا من إنشاء مهمة أخرى.

  2. 2.

    استرداد عملية إنشاء انقطعت

    إذا لم يكن لديك معرّف مهمة، فأعد إرسال مدخلات المهمة المطابقة باستخدام requestId الأصلي. سيعيد ذلك المهمة الموجودة إذا نجح الإنشاء. تغيير المدخلات مع إعادة استخدام ذلك المعرّف يسبب تعارضًا.

  3. 3.

    التمييز بين الفشل والانقطاع

    يعني TaskFailedError أن المهمة وصلت إلى حالة فشل نهائية. افحص errorCode وerror الخاصين بها؛ ولا تواصل استطلاعها أو تعاود إرسال المدخلات غير الصالحة نفسها دون تحقق. أخطاء HTTP طبقة منفصلة من الفشل.

إرسال الحل عند عودة العامل

يطبع المثال معرّف المهمة الجاهزة؛ ولا يرسل أي شيء إلى الهدف. استبدل التعليق الذي يلي الطباعة بعملية الإرسال الخاصة بتطبيقك، واستخدم الحل فورًا بدلًا من انتظار انتهاء كل العمليات في gather.

أرسل الحل المُعاد مع userAgent وsecChUa الخاصين به، وباستخدام الوكيل نفسه المستخدم للحل. تختار الدالة المساعدة successful_proxy في حزمة SDK الوكيل من المهمة الأصلية والنتيجة الجاهزة. النتيجة الجاهزة تعني أنه تم توليد حل، لا أن طلب تطبيقك نجح.

شغّل مهمتك الأولى.

ابدأ برصيد قدره $5 في مساحة العمل.

إنشاء مساحة عمل
استخدام حزمة SDK المتزامنة لـ Python من asyncio · solvethree