Troubleshooting

CaptchaAI Eşzamanlı İstek Sınırları: Teşhis ve Düzeltmeler

ERROR_NO_SLOT_AVAILABLE hatası aslında tek bir şeyi söyler: planınızdaki thread'lerin tamamı o an dolu. CaptchaAI eşzamanlılığı istek sayısıyla değil, thread sayısıyla ölçer — bir thread, aynı anda çözülen tek bir CAPTCHA demektir. BASIC planı 5 thread, STANDARD 15 thread, ADVANCE ise 50 thread sunar ve bu sayı doğrudan sizin eşzamanlı görev tavanınızdır. Bu rehber, tavana takıldığınızı nasıl anlayacağınızı ve kodunuzu tek kuruş fazla ödeme yapmadan bu sınırın altında nasıl tutacağınızı gösterir.


Eşzamanlılık sınırı gerçekte nasıl çalışır?

CaptchaAI'de iki ayrı sınır türü vardır ve ikisini karıştırmak yanlış teşhise yol açar:

Sınır türü Neyi belirler Hata
Eşzamanlı görevler (thread) Aynı anda çözülebilen maksimum görev sayısı ERROR_NO_SLOT_AVAILABLE
İstek hızı in.php / res.php uç noktalarına saniyedeki maksimum API çağrısı HTTP 429

İlki bütçenizle (thread sayısı), ikincisi kod hijyeninizle ilgilidir. Güncel thread tavanınızı CaptchaAI kontrol panelinizden görebilirsiniz.

Somut bir örnek: STANDARD planla ($30/ay, 15 thread) çalışan bir otomasyon geliştiricisiniz ve kodunuz aynı anda 40 reCAPTCHA görevi göndermeye kalkıyor. İlk 15 görev çözülürken kalan 25'i ERROR_NO_SLOT_AVAILABLE ile döner. Doğru refleks planı hemen büyütmek değil, iş yükünü thread tavanınıza göre şekillendirmektir.

Bir noktayı netleştirmek gerekir: thread'ler süreyle değil, doluluğuyla tükenir. Bir görev çözülür çözülmez o thread anında serbest kalır ve sıradaki görevi alır. Yani 15 thread'lik bir planda saatte binlerce CAPTCHA çözebilirsiniz — sınır, aynı anda kaç tanesinin işlendiğidir. Bu ayrım, verimi kod tarafında yönetmenin neden çoğu zaman plan yükseltmekten daha etkili olduğunu açıklar.


Planınıza kaç thread yeter? Hızlı hesaplama

Doğru plan, "en pahalı" olan değil, tepe yükünüzü rahat bir marjla karşılayandır. Pratik kural: bir örnekleme penceresinde aynı anda işlenen görevlerin tepe sayısını ölçün, ardından bu sayının üzerinde thread tavanı sunan planı seçin. Türkiye'deki USD bazlı, aylık ve sabit thread fiyatlandırması, TL kur oynaklığından bağımsız öngörülebilir bir maliyet planlaması sağlar.

Eşzamanlı tepe görev ihtiyacınız Uygun plan
~5 paralel görev BASIC ($15/ay, 5 thread)
~15 paralel görev STANDARD ($30/ay, 15 thread)
~50 paralel görev ADVANCE ($90/ay, 50 thread)
100+ paralel görev PREMIUM ($170/ay, 100 thread) ve üzeri

Örneğin bir e-ticaret ekibinin ödeme akışı QA testlerinde, gece çalışan toplu bir senaryo kısa süreliğine 30–40 paralel doğrulama üretebilir; burada ADVANCE tavanı rahat bir marj bırakır. Kişisel veri içeren test verileriyle çalışıyorsanız, bu akışların KVKK kapsamında yetkili QA süreçleri içinde kaldığından emin olun.


Sınıra takıldığınızın belirtileri

Gördüğünüz Nedeni
ERROR_NO_SLOT_AVAILABLE Tüm thread'ler aynı anda dolu
HTTP 429 yanıtları API uç noktasına saniyede çok fazla istek gidiyor
Bazı görevler başarılı, bazıları başarısız Sınıra aralıklı olarak takılıyorsunuz
Çözüm süreleri uzuyor Hesabınızda kuyruk birikmesi var

Düzeltme 1: Semafor ile eşzamanlılığı sınırlayın

Paralel çalışan görev sayısını doğrudan kod tarafında sınırlayın:

import requests
import time
import threading

API_KEY = "YOUR_API_KEY"
MAX_CONCURRENT = 20  # Stay below your account limit

semaphore = threading.Semaphore(MAX_CONCURRENT)


def solve_captcha(params):
    """Solve a CAPTCHA with concurrency control."""
    with semaphore:
        params["key"] = API_KEY
        params["json"] = 1

        submit = requests.post("https://ocr.captchaai.com/in.php", data=params).json()
        if submit.get("status") != 1:
            raise RuntimeError(f"Submit: {submit.get('request')}")

        task_id = submit["request"]
        time.sleep(10)

        for _ in range(30):
            result = requests.get("https://ocr.captchaai.com/res.php", params={
                "key": API_KEY, "action": "get", "id": task_id, "json": 1
            }).json()
            if result.get("status") == 1:
                return result["request"]
            if result.get("request") != "CAPCHA_NOT_READY":
                raise RuntimeError(f"Solve: {result['request']}")
            time.sleep(5)
        raise TimeoutError("Timed out")

MAX_CONCURRENT değerini plan thread sayınızın biraz altında tutun.


Düzeltme 2: ERROR_NO_SLOT_AVAILABLE'da yeniden deneyin

Sınıra takıldığınızda hemen başarısız olmak yerine kısa süre bekleyip yeniden gönderin:

def submit_with_retry(params, max_retries=5):
    """Submit with automatic retry for slot errors."""
    params["key"] = API_KEY
    params["json"] = 1

    for attempt in range(max_retries):
        resp = requests.post("https://ocr.captchaai.com/in.php", data=params).json()

        if resp.get("status") == 1:
            return resp["request"]

        error = resp.get("request", "")
        if error == "ERROR_NO_SLOT_AVAILABLE":
            wait = 2 ** attempt  # Exponential backoff: 1, 2, 4, 8, 16 seconds
            print(f"No slot available, retrying in {wait}s (attempt {attempt + 1})")
            time.sleep(wait)
            continue
        else:
            raise RuntimeError(f"Submit error: {error}")

    raise RuntimeError("Max retries exceeded — no slots available")

Üstel geri çekilme (exponential backoff), sınır dolduğunda API'yi tekrar tekrar zorlamanızı engeller.


Düzeltme 3: Görevleri bir kuyruğa alın

API'yi boğmak yerine görevleri kuyruğa koyup kontrollü bir hızda işleyin:

from queue import Queue
from threading import Thread

task_queue = Queue()
results = {}


def worker():
    while True:
        task_id_local, params = task_queue.get()
        try:
            token = solve_captcha(params)
            results[task_id_local] = {"status": "ok", "token": token}
        except Exception as e:
            results[task_id_local] = {"status": "error", "message": str(e)}
        finally:
            task_queue.task_done()


# Start worker threads (limited by semaphore)
for _ in range(MAX_CONCURRENT):
    t = Thread(target=worker, daemon=True)
    t.start()

# Add tasks to queue
captcha_tasks = [
    {"method": "userrecaptcha", "googlekey": "KEY1", "pageurl": "https://site1.com"},
    {"method": "userrecaptcha", "googlekey": "KEY2", "pageurl": "https://site2.com"},
    # ... more tasks
]

for i, params in enumerate(captcha_tasks):
    task_queue.put((i, params))

task_queue.join()
print(f"Completed: {len(results)} tasks")

Kuyruk deseni, üretim iş yüklerinde en dayanıklı yaklaşımdır: worker sayısı thread tavanınıza sabitlenir, gelen görev sayısı ne olursa olsun eşzamanlılık asla tavanı aşmaz ve ani yük artışları kuyrukta bekler. Semaforu kuyrukla birleştirdiğinizde ERROR_NO_SLOT_AVAILABLE pratikte ortadan kalkar.


Düzeltme 4: Sorgulama sıklığını düşürün

Çok sık sorgulama hem API çağrılarını boşa harcar hem de istek hızı sınırını tetikleyerek HTTP 429'a yol açar:

# WRONG — polling every 1 second
time.sleep(1)

# CORRECT — poll every 5 seconds
time.sleep(5)

# BETTER — wait longer on initial delay, then poll
time.sleep(15)  # Initial wait
for _ in range(20):
    # ... poll
    time.sleep(5)

Aktif görevleri canlı izleyin

Tavana ne kadar yaklaştığınızı görmek için etkin görev sayısını izleyin:

active_count = 0
lock = threading.Lock()

def track_solve(params):
    global active_count
    with lock:
        active_count += 1
        print(f"Active tasks: {active_count}/{MAX_CONCURRENT}")
    try:
        return solve_captcha(params)
    finally:
        with lock:
            active_count -= 1

Bu sayaç, kod tarafındaki iyileştirmelerin işe yarayıp yaramadığını ölçmenin en hızlı yoludur: değer sürekli tavana yapışıyorsa gerçekten thread'iniz yetmiyordur; ara sıra dokunup geri düşüyorsa sorun kod hijyeninizdedir.


Ne zaman plana yükseltmeli?

Semafor, yeniden deneme ve kuyruk çoğu ERROR_NO_SLOT_AVAILABLE durumunu kod tarafında çözer. Ama bazı durumlarda gerçek darboğaz thread sayınızdır. Şu belirtiler kalıcı olarak tavanda olduğunuzu gösterir:

  • Aktif görev sayacınız saatlerce kesintisiz thread tavanına yapışık kalıyor.
  • Kuyruk sürekli büyüyor ve görevler işlenmeden birikiyor.
  • Çözüm süreleri, CAPTCHA türünün normal SLA'sının çok üzerine çıkıyor.
  • Yeniden deneme sayınız her toplu işte artıyor.

Bu tabloda çözüm, kodu daha fazla sıkıştırmak değil, daha yüksek thread'li bir plana geçmektir. Yükseltme anında devreye girer ve mevcut kod deseninizde hiçbir değişiklik gerektirmez.


SSS

Eşzamanlı görev sınırım kaç thread?

Sınırınız doğrudan planınızın thread sayısıdır: BASIC ($15/ay) 5 thread, STANDARD ($30/ay) 15 thread, ADVANCE ($90/ay) 50 thread. Güncel tavanınızı CaptchaAI panelinizden görebilirsiniz.

MAX_CONCURRENT değerini kaça ayarlamalıyım?

Thread sayınızın biraz altında tutun — örneğin 50 thread'lik bir planda 45 gibi. Böylece yeniden denemeler ve ani yük artışları için boş thread payı bırakırsınız.

Sorgulama (polling) hız sınırını etkiler mi?

Evet. Her res.php çağrısı bir istek olarak sayılır. Her 1 saniyede değil, 5 saniyede bir sorgulayın; aksi halde yalnızca sorgulama bile HTTP 429 üretebilir.

Plan yükseltmeden verimi artırabilir miyim?

Kısmen. Semafor, yeniden deneme ve kuyruk mevcut thread'lerinizi daha verimli kullanır. Ancak sürekli tavandaysanız kalıcı çözüm, daha fazla thread'li bir plana yükseltmektir.

ERROR_NO_SLOT_AVAILABLE kalıcı bir hata mı?

Hayır, geçicidir. Bir thread boşaldığı anda yeniden gönderim başarılı olur. Üstel geri çekilmeyle birkaç saniye bekleyip isteği tekrarlayın.


CaptchaAI ile eşzamanlı verimi ölçeklendirin

İş yükünüz sürekli thread tavanını zorluyorsa, daha yüksek thread sayılı bir plana yükselmek verimi anında artırır. Planları ve thread sayılarını captchaai.com üzerinden inceleyin.


İlgili kılavuzlar

Bu makale için yorumlar devre dışı bırakılmıştır.