2010-01-05 18 views
14

हैलो, पर लिखे बिना पाइथन प्रक्रियाओं के बीच डेटा साझा करने के लिए कैसे मैं पाइथन और प्रक्रियाओं के बीच डेटा की थोड़ी मात्रा (< 1K) साझा करना चाहता हूं। डेटा भौतिक पीसी/104 आईओ डेटा है जो तेजी से और अक्सर बदलता है (24x7x365)। एक एकल "सर्वर" डेटा लिख ​​रहा होगा और इसके कई हिस्सों को पढ़ने वाले कई ग्राहक होंगे। यह सिस्टम हार्ड ड्राइव की बजाय फ्लैश मेमोरी (सीएफ कार्ड) का उपयोग करेगा, इसलिए मैं एक फ़ाइल आधारित योजना के साथ फ्लैश मेमोरी पहनने के बारे में चिंतित हूं। मैं कम बिजली (प्रोसेसर समय) का उपयोग करना चाहूंगा क्योंकि हम 100% सौर संचालित हैं।डिस्क

  • क्या यह एक वैध चिंता है? हम संभवतः सीएफ कार्ड को एसएसडी में बदल सकते हैं।
  • क्या एमएमएपी का उपयोग करके मूल्य बदलना भौतिक रूप से डेटा को डिस्क पर लिखता है या यह वर्चुअल फ़ाइल है?
  • हम डेबियन पर चलेंगे, इसलिए शायद पाइथन मॉड्यूल के लिए पॉज़िक्स आईपीसी सबसे अच्छा समाधान है। क्या किसी ने इसका इस्तेमाल किया है?
  • क्या किसी ने Python Object Sharing (POSH) मॉड्यूल का प्रयास किया है? यह पहली नज़र में आशाजनक दिखता है लेकिन यह "अल्फा" में है और सक्रिय रूप से विकसित नहीं किया जा रहा है।

धन्यवाद

अद्यतन: हम के बारे में 10 हर्ट्ज के लिए अधिकतम डाटा अद्यतन दर है, लेकिन अधिक आम तौर पर 1 हर्ट्ज धीमा। ग्राहकों को केवल तब सूचित किया जाएगा जब एक स्थिर अद्यतन दर के बजाय मूल्य बदलता है। हम एक से अधिक सर्वर/एकाधिक क्लाइंट मॉडल पर गए हैं जहां प्रत्येक सर्वर एक निश्चित प्रकार के उपकरण या फ़ंक्शन में माहिर हैं। चूंकि यह पता चला कि अधिकांश प्रोग्रामिंग जावा प्रोग्रामर द्वारा किए जा रहे थे, हम टीसीपी पर जेएसओएन-आरपीसी का उपयोग कर समाप्त हो गए। सर्वर जावा में लिखे जाएंगे लेकिन मुझे अभी भी पाइथन में मुख्य क्लाइंट लिखने की उम्मीद है और मैं JSON-RPC कार्यान्वयन की जांच कर रहा हूं।

+1

+1। बहुत बढ़िया। – gahooa

+1

क्या आप इस बात पर टिप्पणी कर सकते हैं कि डेटा कितनी बार बदलता है, और उपभोक्ताओं को कितनी बार अद्यतन करने की आवश्यकता होती है? वह जानकारी सर्वश्रेष्ठ दृष्टिकोण चुनने में मदद करेगी। – gahooa

+0

कुछ डेटा मान दूसरे में दो बार बदल सकते हैं जबकि कुछ शायद ही कभी बदलते हैं। ऐसा लगता है कि कुछ अन्य प्रक्रियाएं जावा हो सकती हैं, इसलिए सॉकेट दृष्टिकोण सबसे अच्छा दिख रहा है। मुझे लगता है कि मैं ऐसा कुछ करने की कोशिश करूंगा जहां एक ग्राहक (उपभोक्ता) एक निश्चित मूल्य (जैसे मोटर वर्तमान, स्विच स्थिति, हवा की गति इत्यादि) में अपनी रुचि पंजीकृत करता है और जब भी मूल्य बदलता है तो सर्वर क्लाइंट को अद्यतन भेजता है। ग्राहक डिजिटल आउटपुट के लिए राज्य परिवर्तन का भी अनुरोध कर सकता है। – RyanN

उत्तर

8

सर्वर प्रक्रिया में दाखिल करने के लिए सीधे ग्राहक प्रक्रियाओं के लिए लिखने के लिए हो सकता है डेटा लेखन के लिए एक वैकल्पिक:

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

+0

यही वह है जो मैं सोच रहा था (यूडी, या टीसीपी सॉकेट)। यहां तक ​​कि यूनिक्स पर केवल एक फीफो बनाना। – richo

4

ramfs विभाजन बनाएं और उसे लिखें। (आप tmpfs का उपयोग कर सकते हैं, लेकिन tmpfs के विपरीत, ramfs डिस्क पर नहीं बदला जाता है)। हालांकि, चूंकि रैमफ्स की आकार सीमा नहीं है, आपको ध्यान रखना चाहिए कि आप स्मृति से बाहर नहीं हैं; चूंकि आप केवल एक छोटे से डेटा लिख ​​रहे हैं, यह कोई समस्या नहीं होनी चाहिए।

इस प्रकार, आपका डेटा कभी भी डिस्क पर नहीं लिखा जाएगा (नोट: यदि बिजली विफल हो जाती है तो आप उन्हें खो देंगे)।

See also the ramfs docs

2

Wikipedia article about the mmap system call के अनुसार, मेमोरी मैप की गई सामग्री सामग्री अद्यतन होने पर डिस्क पर वापस लिखी जाती है।

क्या आपने मल्टीप्रोसेसिंग मॉड्यूल (मानक लाइब्रेरी में) देखा है - विशेष रूप से प्रक्रियाओं के बीच भाग साझा करने वाला राज्य?

पिस्कर्व द्वारा वर्णित रामफ्स भी एक अच्छा समाधान लगता है - खासकर जब सभी प्रक्रियाओं को पायथन में लिखा नहीं जाता है।

0

फ्लैश सिस्टम पर चलते समय, सुनिश्चित करें कि आपकी फाइल सिस्टम फ्लैश मेमोरी (लेवलिंग पहनने) के जीवन को अधिकतम करने के लिए ठीक से डिज़ाइन किया गया है। JFFS और, मुझे विश्वास है, अन्य अब इसे प्रभावी ढंग से करने में सक्षम हैं। यदि आप इस तरह के सिस्टम का उपयोग करते हैं, तो आपको फ्लैश का उपयोग करने के बारे में अत्यधिक चिंतित नहीं होना चाहिए, लेकिन निश्चित रूप से यदि आप डेटा की निरंतर स्ट्रीम लिख रहे हैं तो आप फ़्लैश पर ऐसा करने से बचना चाहते हैं।

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

और निश्चित रूप से मानक लाइब्रेरी multiprocessing मॉड्यूल है, जो प्रक्रियाओं के बीच संचार के तरीके के संदर्भ में कुछ समानताएं रखता है। मैं इस क्षेत्र में किसी भी नए विकास के लिए वहां से शुरू करूंगा, और केवल तभी बाहर जाउंगा जब यह बाहर निकलने में असफल रहा। पाइथन + सौर संचालित के लिए