2012-05-10 14 views
17

Podczas wywiercenie zeroMQ (A very useful socket replacement for those who don't know), natknąłem się na to pytanie na liście mailingowej:Jakie jest uzasadnienie kontekstu zeroMQ?

Using multiple contexts : Is there a downside to using multiple contexts?

Czy istnieje Minusem korzystania z wielu kontekstów? Mam opakowanie klasowe, które chciałbym zachować tak proste, jak to tylko możliwe. Mogę go zmodyfikować, aby umożliwić wiele połączeń, gniazd itp. W jednym kontekście lub pozostawić go tak, jak jest i kilka razy go utworzyć.

Dwa wady, jak to widzę.

  1. uruchamiania środków na żadnym dobrym skutkiem (extra ślad pamięci, innym wątku I/O, etc)
  2. gniazd utworzonych w różnych kontekstach nie może komunikować się ze sobą za pomocą transportować „InProc”. Nazwa "inproc" jest trochę myląca; to naprawdę oznacza "intrakontekst".

cr

Patrząc wstecz na moje i różnym innym kodem źródłowym, w końcu zrozumiał, że kontekst set-up code:

void *context = zmq_init (1); //creates the context 

void *responder = zmq_socket (context, ZMQ_REP); //creates the socket 

zmq_bind (responder, "tcp://*:5555"); //and binds it 

... //Do whatever you want with the socket ... 

zmq_close (responder); //destructors 
zmq_term (context); 

może skutecznie brzmienie:

void *context = zmq_init(1); //saving the context is optional 

responder = zmq_socket(type); //creates the socket 
//additional [context] can be provided if desired (multi-context?) 

zmq_bind (responder, "tcp://*:5555"); //and binds it 

... //Do whatever you want with the socket ... 

zmqx_dest(); //destroys the global context, else provide alternative [context] 

I to właśnie zrobiłem z makrami. Sprawia, że ​​łatwiej jest mieć 1 zmienną mniej do śledzenia (spośród 100 innych). Choć jest to dalekie od "ideału", ponieważ wymaga, aby makra znajdowały się w tym samym "zakresie funkcji", chociaż można to łatwo rozwiązać.

Podczas gdy moim przykładem jest C, jest to w pewnym stopniu niepotwierdzone językowo.


Stąd pytanie, jaki jest sens/korzyści z tworzenia takich kontekstów?

Kiedy jest to wada, aby pozwolić na taką funkcję? Ponieważ mogę łatwo przewidzieć wielu (którzy po prostu kopiują/wklejają/edytują kod), nie biorę pod uwagę dodatkowego obciążenia i tworzę "wiele kontekstów", gdy nie jest to potrzebne [widziałem to wiele razy dla innej podobnej struktury, chociaż ich istnienie ma własne uzasadnienie]

Jednym z powodów, dla których to mówię, jest fakt, że rozważam użycie zeroMQ w module do programowania gier dla początkujących. Całkiem w dużej części ze względu na swoją prostotę i fakt, że gniazda mają tendencję do smażenia komórek mózgowych dla nowych facetów.


Random I rzeczywiście uzasadnione przesłanki systemu kontekstowego V8 Google (podobne pytanie; inny system): What is the design rationale behind HandleScope?

Odpowiedz

17

To jest dobre pytanie. Jeśli nie chcesz zapisywać globalnego kontekstu, po co poprosić aplikację o jego utworzenie? libzmq może trywialnie ustawić swój stan, kiedy jest potrzebny za pierwszym razem.

Jednak problem ze starszym API 0MQ nie polega na tym, że zmusza do korzystania z kontekstów, ponieważ są one naturalną klasą rodzica dla gniazd. Problem polega na tym, że po przejściu do wysiłku tworzenia i śledzenia kontekstów otrzymujesz prawie żadnej wartości dla swojej pracy. Wydaje się, że wszystkie koszty i brak korzyści.

Jeśli spojrzysz na nowsze interfejsy API, np. CZMQ i 0MQ/3.1 zobaczysz, że konteksty są znacznie bardziej użyteczne. W CZMQ, czysto zamykamy i niszczymy wszystkie gniazda podczas niszczenia kontekstu. To naprawdę przydatne. W wersji 0MQ/3.1 dodaliśmy konfigurację kontekstu, taką jak liczba wątków I/O itd. Również API jest bardziej spójne (zmq_ctx_new, zmq_ctx_set/get, zmq_ctx_destroy) z modelem klasy (i wygląda bardziej jak CZMQ).

+1

Więc sprowadza się do wygodnego pojemnika do usunięcia w razie potrzeby = D – PicoCreator

Powiązane problemy