2012-05-10 10 views
17

zeroMQ (A very useful socket replacement for those who don't know) आसपास poking करते समय, मैंने मेलिंग सूची में यह सवाल भर में आया था:शून्य एमक्यू संदर्भ के पीछे तर्क क्या है?

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

वहाँ कई संदर्भों का उपयोग कर के लिए एक नकारात्मक पक्ष यह है? मेरे पास एक क्लास रैपर है जो मैं जितना संभव हो उतना सरल रखना चाहता हूं। मैं इसे एक ही संदर्भ में एकाधिक कनेक्ट, सॉकेट इत्यादि को अनुमति देने के लिए संशोधित कर सकता हूं या इसे छोड़ सकता हूं और रैपर के क्लाइंट इसे कई बार तुरंत चालू कर सकते हैं।

दो डाउनसाइड्स जैसा कि मैं इसे देखता हूं।

  1. कोई अच्छा प्रभाव (अतिरिक्त स्मृति पदचिह्न, एक और मैं/हे धागा, आदि)
  2. सॉकेट विभिन्न संदर्भों में बनाया करने के लिए संसाधनों को मिलाकर नहीं कर सकते हैं एक दूसरे को 'inproc' परिवहन का उपयोग कर के साथ संवाद। 'इनप्रोक' नाम एक गलत नामक है; यह वास्तव में "intracontext" का मतलब है।

करोड़

मेरा और विभिन्न अन्य स्रोत कोड को वापस देख रहे हैं, मैं अंत में एहसास हुआ कि संदर्भ सेट अप कोड:

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); 

प्रभावी ढंग से बदल दिया जा सका:

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] 

और मैक्रोज़ के साथ मैंने यही किया। इससे चीजों को ट्रैक करने के लिए 1 चर कम हो जाता है (100 अन्य लोगों के बीच)। हालांकि यह "आदर्श" से बहुत दूर है क्योंकि मैक्रोज़ को "फ़ंक्शन स्कोप" के भीतर होने की आवश्यकता होती है, हालांकि इसे आसानी से हल किया जा सकता है।

जबकि मेरा उदाहरण सी है, यह कुछ हद तक भाषा-अज्ञेयवादी है।


इसलिए सवाल, ऐसे संदर्भों बनाने की बात/लाभ क्या है?

जब यह वास्तव में ऐसी सुविधा की अनुमति देने के लिए नकारात्मक है? क्योंकि मैं आसानी से कई लोगों को देख सकता हूं (जो सिर्फ कॉपी/पेस्ट/कोड संपादित करते हैं), अतिरिक्त ओवरहेड को ध्यान में रखते हुए, और इसकी आवश्यकता होने पर "कई संदर्भ" बनाते हैं [अन्य समान संरचना के लिए यह कई बार देखा गया है, हालांकि उनके अस्तित्व में इसका अपना औचित्य]

मैं यह कह रहा हूं कि एक कारण यह है कि मैं शुरुआती गेम प्रोग्रामिंग मॉड्यूल में शून्य एमक्यू का उपयोग करने पर विचार कर रहा हूं। इसकी सादगी के कारण काफी हद तक काफी हद तक, और तथ्य यह है कि सॉकेट नए लोगों के लिए मस्तिष्क कोशिकाओं को फ्राइंग करते हैं। What is the design rationale behind HandleScope?

उत्तर

17

यह एक अच्छा सवाल है:


रैंडम, मैं वास्तव में गूगल के वी 8 संदर्भ प्रणाली के औचित्य (अलग प्रणाली समान प्रश्न) जायज। यदि आपको वैश्विक संदर्भ को सहेजने की आवश्यकता नहीं है, तो ऐप को इसे बनाने के लिए क्यों भी पूछें? libzmq पहली बार आवश्यकता होने पर अपने राज्य को छोटे से सेट अप कर सकता है।

हालांकि 0 एमक्यू की पुरानी एपीआई के साथ समस्या यह नहीं है कि यह आपको संदर्भों का उपयोग करने के लिए मजबूर करता है, क्योंकि ये सॉकेट के लिए एक प्राकृतिक अभिभावक वर्ग हैं। समस्या यह है कि संदर्भ बनाने और ट्रैक करने के प्रयास में जाने के बाद आपको अपने काम के लिए लगभग कोई मूल्य नहीं मिलता है। ऐसा लगता है कि सभी लागत और कोई फायदा नहीं है।

यदि आप हालिया एपीआई देखते हैं, उदा। सीजेडएमक्यू और 0 एमक्यू/3.1 आप देखेंगे कि संदर्भ अधिक उपयोगी हैं। सीजेडएमक्यू में, हम एक संदर्भ को नष्ट करते समय सभी सॉकेट को बंद कर देते हैं और नष्ट कर देते हैं। यह वास्तव में उपयोगी है। 0 एमक्यू/3.1 में हमने कुछ संदर्भ कॉन्फ़िगरेशन जोड़े, जैसे कि I/O थ्रेड्स इत्यादि। इत्यादि भी एक वर्ग मॉडल के साथ एपीआई अधिक संगत (zmq_ctx_new, zmq_ctx_set/get, zmq_ctx_destroy) है (और सीजेएमएमक्यू की तरह दिखता है)।

+1

तो जब आवश्यक हो तो निपटने के लिए यह एक सुविधाजनक कंटेनर को उबालता है = डी – PicoCreator

संबंधित मुद्दे