multi-threaded FastCGI-App

Möchte ich mal eine FastCGI-Anwendung sollte in der Lage mehrere gleichzeitige Anfragen, die Verwendung von threads. Ich hatte einen Blick auf die Gewinde.c Probe, die mit dem SDK geliefert:

#define THREAD_COUNT 20
static int counts[THREAD_COUNT];

static void *doit(void *a)
{
    int rc, i, thread_id = (int)a;
    pid_t pid = getpid();
    FCGX_Request request;
    char *server_name;

    FCGX_InitRequest(&request, 0, 0);

    for (;;)
    {
        static pthread_mutex_t accept_mutex = PTHREAD_MUTEX_INITIALIZER;
        static pthread_mutex_t counts_mutex = PTHREAD_MUTEX_INITIALIZER;

        /* Some platforms require accept() serialization, some don't.. */
        pthread_mutex_lock(&accept_mutex);
        rc = FCGX_Accept_r(&request);
        pthread_mutex_unlock(&accept_mutex);

        if (rc < 0)
            break;

        server_name = FCGX_GetParam("SERVER_NAME", request.envp);

        FCGX_FPrintF(request.out,…
        …     

        FCGX_Finish_r(&request);
    }

    return NULL;
}

int main(void)
{
    int i;
    pthread_t id[THREAD_COUNT];

    FCGX_Init();

    for (i = 1; i < THREAD_COUNT; i++)
        pthread_create(&id[i], NULL, doit, (void*)i);

    doit(0);

    return 0;
}

In der FastCGI-Spezifikation es ist eine Erklärung, wie der web-server wird bestimmen, wie viele verbindungen unterstützt durch die FastCGI-app:

Web-server kann die Abfrage bestimmter
Variablen, die innerhalb der Anwendung. Die
server wird in der Regel führen Sie eine Abfrage
beim starten der Anwendung, um zu
automatisieren bestimmte Aspekte des Systems
- Konfiguration.

...

• FCGI_MAX_CONNS: Die maximale Anzahl
der gleichzeitige transport-verbindungen
diese Anwendung akzeptiert, z.B. "1"
oder "10".

• FCGI_MAX_REQS: Die maximale Anzahl
von gleichzeitigen Anfragen diese
Anwendung akzeptiert, z.B. "1" oder
"50".

• FCGI_MPXS_CONNS: "0", wenn dies
Anwendung nicht-multiplex
verbindungen (D. H. gleichzeitigen Griff
Anfragen über jede Verbindung), "1"
ansonsten.

Aber die return Werte für diese Abfrage sind hart codiert in der FastCGI-SDK und gibt 1 für FCGI_MAX_CONNS und FCGI_MAX_REQS und 0 für FCGI_MPXS_CONNS. Also das Gewinde.c-Probe erhalten nie mehrere verbindungen.

Getestet habe ich das Beispiel mit lighttpd und nginx, und die app behandelt nur eine Anfrage auf einmal. Wie kann ich meine Anwendung für die Verarbeitung mehrerer Anfragen? Oder ist das der falsche Ansatz?

  • Wie hast du den test Parallelität? Es gibt eine Menge unterschiedlicher Informationen über den Grad, zu dem FCGI unterstützt Parallelität. Während ich nicht behaupten, alle Antworten haben herausgefunden, ich habe versucht, eine multi-Thread-test, um zu überprüfen Parallelität: Zwei threads zum akzeptieren von verbindungen konfiguriert. Der erste Schlaf für 10s nach dem akzeptieren einer Verbindung, die Sperrung, die thread. Eine zweite Verbindung wird angenommen und beantwortet. Endlich, der erste thread beendet ist und reagiert. Deine Frage ist fast ein Jahr alt, aber ich habe Probleme Antworten zu finden über FCGI, ich hoffe das hilft.
InformationsquelleAutor MarcS82 | 2011-04-29
Schreibe einen Kommentar