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ę.
- uruchamiania środków na żadnym dobrym skutkiem (extra ślad pamięci, innym wątku I/O, etc)
- 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?
Więc sprowadza się do wygodnego pojemnika do usunięcia w razie potrzeby = D – PicoCreator