2011-06-26 12 views
7

के एकाधिक आमंत्रणों में ऑब्जेक्ट आवृत्ति को साझा करने के लिए मैं एक लाइब्रेरी का उपयोग कर रहा हूं जो बाहरी प्रोग्राम में पाइथन इंटरफ़ेस प्रदान करता है।पायथन: स्क्रिप्ट

foo = Foo() 

कोड ऊपर फू कार्यक्रम है कि मैं अजगर के भीतर से नियंत्रित कर सकते हैं का एक नया उदाहरण शुरू होता है: यह मैं बनाने के लिए अनुमति देता है।

मेरे पास एक पाइथन स्क्रिप्ट है जिसे कई बार बुलाया जाना चाहिए और बाहरी पैरामीटर के आधार पर, बाहरी ची प्रोग्राम के एक अलग उदाहरण को अलग-अलग चीजों को करने के लिए बताएं। के बाद से है कि फू हर बार मेरी स्क्रिप्ट चलाता है का एक नया उदाहरण बनाता स्पष्ट मैं

foo = Foo() हर,

नहीं कर सकते।

मैं क्या करना चाहता हूं foo= Foo() एक बार बनाने के लिए, और एकाधिक आमंत्रण एक ही उदाहरण साझा करते हैं। वर्तमान में मैं इसे एक बार बनाने के बारे में सोच रहा हूं, इसे क्रमबद्ध करता हूं, और मेरी स्क्रिप्ट इसे deserialize है। क्या यह दृष्टिकोण काम करता है? क्या कोई बेहतर विकल्प है?

धन्यवाद !!

उत्तर

3

यदि आप this answer में दिए गए किसी भी दृष्टिकोण का पालन करते हैं तो यह किया जा सकता है। या आप Pyro का उपयोग कर सकते हैं, जिसे this answer में मल्टीप्रोसेसिंग की तुलना में किया जाता है।

0

आप pickle का उपयोग करने में सक्षम हो सकते हैं। यहाँ एक सरल उदाहरण है:

import os, pickle 

class Foo(object): 
    def __init__(self, bar): 
     self.bar = bar 

# use previous pickled instance if found 
if os.path.exists('foo.pickle'): 
    with open('foo.pickle') as f: 
     foo = pickle.load(f) 
else: 
    foo = Foo(42) 

# print current foo.bar 
print foo.bar 

# change foo.bar and pickle 
foo.bar = raw_input('new bar: ') 
with open('foo.pickle', 'w') as f: 
    pickle.dump(foo, f) 
+0

मैंने वास्तव में ऐसा करने की कोशिश की, मुझे एक संदेश मिला, "लॉक नहीं ले सकता 'ऑब्जेक्ट: "। मैं अब इसमें देख रहा हूँ। – wk1989

+0

हाँ, इसमें ऐसी सीमाएं हैं जिन्हें आप अपनी इच्छानुसार काम करने में सक्षम नहीं हो सकते हैं: http://docs.python.org/library/pickle.html#what-can-be-pickled-and-unpickled – zeekay

+2

यदि आप लॉक का उपयोग कर रहे हैं, तो आपको शायद अपने वर्ग – lunixbochs

0

आप डिजाइन बदल सकते हैं ताकि Foo() सिर्फ एक मौजूदा प्रक्रिया से कनेक्ट करता है, और फिर आप एक नया कार्य बनाने के लिए, यह startFoo() फोन है कि आप पहले से ही कॉल किया (या Foo() विफल रहता है) । प्रोग्राम को बनाना भी बेहतर होगा कि Foo() एक सॉकेट से कनेक्ट होने वाली किसी सेवा से जुड़ता है। आप बस मल्टीप्रोसेसिंग मॉड्यूल पर स्विच करना चाहेंगे।

+0

पर लॉक एक्सेस प्रदान करने के लिए सॉकेट या पाइप जैसे किसी अन्य पथ को लेने की आवश्यकता है हाँ मुझे लगता है कि मुझे ऐसा करना होगा क्योंकि मैं Foo ऑब्जेक्ट को क्रमबद्ध नहीं कर सकता आसानी से। – wk1989