2012-06-26 15 views
6

In C abbiamo Socket e descrittori, è possibile prendere solo uno di questi e passarli a un Thread, questo rende possibile che tu possa accettare le connessioni in entrata e dare il lavora su una Discussione che ti piace e la Discussione può inviare da sola la risposta.ZeroMQ: come ottenere il multithreading C-like

La mia domanda è, come posso ottenere questo con ZeroMQ? Con il modello di richiesta di risposta sembra che non possa inviare e ricevere in modo asincrono, le risposte devono essere in sequenza, il mio obiettivo sarebbe avere più client su un singolo server, inviando risposte non in sequenza.

Ho dato un'occhiata al modello di risposta alla richiesta ma l'API afferma chiaramente che l'utilizzo di tale socket con più thread è una cattiva idea. Forse mi sono perso qualcosa o ZeroMQ è più intelligente di quanto io sappia. Se hai bisogno di ulteriori informazioni basta postare un commento e farò del mio meglio per dare le informazioni.

ho avuto anche uno sguardo agli esempi forniti: Code Examples

Ecco la descrizione Socket: ZMQ-Socket

risposta

3

Dopo giorni di ricerca, una persona amichevole in IRC nel canale zeromq mi ha fornito assistenza.

Un collegamento aggiornato nel caso qualcuno lo stia ancora cercando. Dovrebbe essere persistente! http://zguide.zeromq.org/

Questo esempio funziona davvero bene, è facile da adattare, ho usato boost thread con un threadpool.

+0

Sfortunatamente, quella pagina non esiste. Cura di postarlo qui, quindi questa è una risposta? –

+0

Ciao d -_- b ecco un'altra opzione per esso con waybackmachine http://web.archive.org/web/20120704201150/http://www.zeromq.org/blog:multithreaded-server –

+0

Buona lettura. Grazie Oliver. –

2

quanto ho capito, è necessario un server che vogliono fare nuovo thread per ogni connessione in entrata e in ogni thread rispondere esattamente a una connessione, in tal caso questo è codice di esempio che fa esattamente questo: http://www.kieser.net/linux/java_server.html

+0

Grazie Shahryar per il vostro sforzo, la mia richiesta qui è davvero con "zeroMq" la ragione di ciò è la scalabilità, vorrei poter estendere l'applicazione in seguito per far sì che i lavoratori su macchine diverse eseguano le attività, con zeromq posso "in base al modello" espandere il mio modello con la libreria per hanno un modello diverso e quindi hanno una maggiore scalabilità. –

2

Spesso, quando si tenta di adattare i progetti esistenti a 0MQ, si creano problemi. Qui il design esistente passa i socket (tipicamente, HTTP) ai processi o ai thread figlio e quindi consente loro di rispondere. Non è un design molto elegante. Funziona perché ogni nuova connessione esiste come un socket e perché quando viene inviata una risposta, il socket viene distrutto. Nessuno di questi si applica alle applicazioni 0MQ.

Il design 0MQ utilizza un socket ROUTER di frontend che richiama le richieste dei client. Passa quindi queste richieste ai thread worker attraverso inproc: // socket, utilizzando un DEALER di backend per gestire le richieste. I thread worker utilizzano un socket REP per ricevere le richieste e inviare nuovamente le loro risposte. Il thread principale quindi esegue il polling su entrambi i socket frontend e backend, semplicemente instradando i messaggi tra i due.

Il che è ciò che il vecchio articolo del blog spiega (utilizzando i nomi legacy XREP/XREQ), ed è spiegato più in dettaglio con esempi in molte lingue qui: http://zguide.zeromq.org/page:all#Multithreading-with-MQ