asyncio içinden senkron Python SDK'sını kullanın

solvethree tarafından3 dk okuma

Senkron Solvethree.solve yöntemini olay döngünüzü engellemeden çalıştırmak için asyncio.to_thread kullanın. İş aktarımını bir semaforla sınırlayın ve her çalışan çağrısının içinde ayrı bir istemci oluşturun. SDK'nın yerel bir asenkron istemcisi yoktur; istekleri ve yoklamaları iş parçacığında senkron olarak çalışmaya devam eder.

Bu sayfada

İş yükünü sınırlayın ve SDK'nın son süresini ayarlayın

Örnek, Python 3.10+ ve resmi Python SDK'sını gerektirir. Sunucu ortamınızda SOLVETHREE_API_KEY ve SOLVETHREE_PROXY değişkenlerini ayarlayın. accounts.example.com ve login değerlerini hedef ana makine adınız ve eyleminizle değiştirin. Site için çalışma alanınızın erişebildiği etkin bir profil zaten bulunmalıdır; site profili kurulumuna bakın.

asyncio · senkron SDK iş yükünü sınırlama
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.
  • Semafor, gather işlevine gönderilen sekiz işten aynı anda dördüne izin verir. Boş yer bekleyen işler henüz SDK çağrılarını başlatmamıştır.
  • Her çalışan, iş parçacıkları arasında bir istemciyi paylaşmak yerine kendi Solvethree istemcisini oluşturur.
  • SDK'nın timeout=180 ayarı, çözüm için son süreyi belirler. Semaforu beklerken geçen süre buna dahil değildir. Await etrafına eklenen bir asyncio zaman aşımı, SDK'nın bu son süresinin yerini tutmaz.
  • Görev ve ona ait requestId, çalışana girilmeden önce oluşturulur. Her hata oluştuğunda yeni bir kimlik üretmek yerine her ikisini de kurtarma için erişilebilir tutun.

SDK görevi bir kez oluşturur ve hazır olana veya hata verene kadar yoklar. solve etrafına ikinci bir yoklama döngüsü yazmanız gerekmez.

İptal, çalışanı veya uzaktaki görevi durdurmaz

to_thread sonucunu bekleyen coroutine'i iptal etmek, zaten çalışan bir iş parçacığını durdurmaz veya uzaktaki çözüm işlemini iptal etmez. Örnekteki normal istisna işleyicisi, iptal sonrası temizleme işlemi değildir.

Bu durum eşzamanlılık sınırını da etkiler: çalışan devam ederken iptal, semaforu serbest bırakabilir. Hemen yerine yeni işler alırsanız dörtten fazla SDK çağrısı etkin kalabilir. İptal sırasında kesin bir sınıra ihtiyacınız varsa tamamlanmamış çalışanları takip edin ve bitene kadar kapasitelerini dolu tutun.

Üretim ortamında kullanım için, görevin tam girdilerini ve istek kimliğini coroutine sonlandıktan sonra kurtarma akışınızın erişebileceği bir yerde saklayın. Zaman aşımı, sonuç almayı bıraktığınız anlamına gelir; görev oluşturmanın başarısız olduğu anlamına gelmeyebilir.

  1. 1.

    Bilinen bir görevi kurtarın

    Python SDK hatasının task_id ve request_id alanlarını inceleyin. Görev kimliğiniz varsa başka bir görev oluşturmak yerine get_task ile görevi almaya devam edin.

  2. 2.

    Kesintiye uğrayan oluşturma işlemini kurtarın

    Görev kimliğiniz yoksa aynı görev girdilerini özgün requestId ile yeniden gönderin. Oluşturma başarılı olduysa bu, mevcut görevi döndürür. Aynı kimliği yeniden kullanırken girdileri değiştirmek çakışmaya yol açar.

  3. 3.

    Başarısızlığı kesintiden ayırın

    TaskFailedError, görevin nihai başarısız durumuna ulaştığı anlamına gelir. errorCode ve error alanlarını inceleyin; görevi yoklamaya devam etmeyin veya değiştirilmemiş geçersiz girdileri körü körüne yeniden denemeyin. HTTP hataları ayrı bir hata katmanıdır.

Çalışan döndüğünde çözümü gönderin

Örnek, hazır görevin kimliğini yazdırır; hedefe hiçbir şey göndermez. Bu yazdırma işleminden sonraki yorumu uygulamanıza özgü gönderim işlemiyle değiştirin ve gather içindeki tüm işlerin bitmesini beklemek yerine çözümü hemen kullanın.

Döndürülen çözümü, ona ait userAgent, secChUa ve çözüm için kullanılan aynı proxy ile gönderin. SDK'nın successful_proxy yardımcısı, proxy'yi özgün görevden ve hazır sonuçtan seçer. Hazır bir sonuç, çözüm üretildiği anlamına gelir; uygulama isteğinizin başarılı olduğu anlamına gelmez.

İlk görevinizi çalıştırın.

$5 çalışma alanı kredisiyle başlayın.

Çalışma alanı oluşturun
asyncio içinden senkron Python SDK'sını kullanın · solvethree