asyncio içinden senkron Python SDK'sını kullanın
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.
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,
gatheriş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
Solvethreeistemcisini oluşturur. - SDK'nın
timeout=180ayarı, çö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.
Bilinen bir görevi kurtarın
Python SDK hatasının
task_idverequest_idalanlarını inceleyin. Görev kimliğiniz varsa başka bir görev oluşturmak yerineget_taskile görevi almaya devam edin. - 2.
Kesintiye uğrayan oluşturma işlemini kurtarın
Görev kimliğiniz yoksa aynı görev girdilerini özgün
requestIdile 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.
Başarısızlığı kesintiden ayırın
TaskFailedError, görevin nihai başarısız durumuna ulaştığı anlamına gelir.errorCodeveerroralanları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.
Kaynaklar ve API referansı
İlk görevinizi çalıştırın.
$5 çalışma alanı kredisiyle başlayın.