दिलचस्प पोस्ट
एक गेम के लिए जावा में डबल बफर कैसे करें? एसक्यूएललेमी, to_sql का इस्तेमाल करते हुए पंडों के साथ MySQL डाटाबेस में लेखन mysql_num_rows (): आपूर्ति की गई तर्क एक मान्य MySQL परिणाम संसाधन नहीं है ओरेकल (पुराने?) जुड़ता है – रूपांतरण के लिए एक उपकरण / स्क्रिप्ट? पायथन और क्लियर सीज़ सेट्यूव्यू अजगर में सेलेनियम वेबड्रिवर का उपयोग करके मैं एक वेब पेज कैसे स्क्रॉल कर सकता हूं? अजगर लॉगिंग हैंडलर में setLevel का क्या मतलब है? जीसीसी एमिंगव का प्रयोग करके द्विआधारी ब्लॉब्स एम्बेड करना IE8 और 9 में प्लेसहोल्डर विशेषता का समर्थन कैसे करें फिक्स्ड स्थिति लेकिन कंटेनर के सापेक्ष मैं एक पायथन समारोह का स्रोत कोड कैसे प्राप्त करूं? Urlib और अजगर के माध्यम से एक चित्र डाउनलोड करना IXmlSerializable को लागू करने के लिए उचित तरीका है? रूबी में __FILE__ क्या मतलब है? XHR अनुरोध की प्रतिक्रिया के रूप में रिडायरेक्ट रिटर्निंग

पायथन: मैं अजैथ फ़ंक्शन को समानांतर में कैसे चला सकता हूँ?

मैंने पहले शोध किया और मेरे प्रश्न का उत्तर नहीं मिला। मैं कई फ़ंक्शन को पायथन में समानांतर में चलाने की कोशिश कर रहा हूं।

मेरे पास ऐसा कुछ है:

files.py import common #common is a util class that handles all the IO stuff dir1 = 'C:\folder1' dir2 = 'C:\folder2' filename = 'test.txt' addFiles = [25, 5, 15, 35, 45, 25, 5, 15, 35, 45] def func1(): c = common.Common() for i in range(len(addFiles)): c.createFiles(addFiles[i], filename, dir1) c.getFiles(dir1) time.sleep(10) c.removeFiles(addFiles[i], dir1) c.getFiles(dir1) def func2(): c = common.Common() for i in range(len(addFiles)): c.createFiles(addFiles[i], filename, dir2) c.getFiles(dir2) time.sleep(10) c.removeFiles(addFiles[i], dir2) c.getFiles(dir2) 

मैं func1 और func2 कॉल करना चाहता हूं और उन्हें एक ही समय में चलाना है। फ़ंक्शन एक-दूसरे के साथ या समान ऑब्जेक्ट के साथ इंटरैक्ट नहीं करते हैं। अभी मुझे func1 को शुरू करने के लिए इंतजार करना होगा func2 को शुरू करने से पहले। मैं नीचे की तरह कुछ कैसे कर सकता हूं:

 process.py from files import func1, func2 runBothFunc(func1(), func2()) 

मैं एक ही समय के करीब दोनों निर्देशिकाओं को बनाने में सक्षम होना चाहता हूँ क्योंकि हर मिनट मैं गिनती हूं कि कितनी फाइलें बनाई जा रही हैं यदि निर्देशिका वहां नहीं है तो यह मेरे समय को बंद कर देगा।

वेब के समाधान से एकत्रित समाधान "पायथन: मैं अजैथ फ़ंक्शन को समानांतर में कैसे चला सकता हूँ?"

आप threading या multiprocessing threading इस्तेमाल कर सकते हैं

सीपीआईथॉन की अजीबताओं के कारण, threading सही समानता प्राप्त करने की संभावना नहीं है। इस कारण से, multiprocessing आम तौर पर एक बेहतर शर्त है

यहां एक पूर्ण उदाहरण है:

 from multiprocessing import Process def func1(): print 'func1: starting' for i in xrange(10000000): pass print 'func1: finishing' def func2(): print 'func2: starting' for i in xrange(10000000): pass print 'func2: finishing' if __name__ == '__main__': p1 = Process(target=func1) p1.start() p2 = Process(target=func2) p2.start() p1.join() p2.join() 

बाल प्रक्रियाओं को शुरू करने / जुड़ने की यांत्रिकी आसानी से आपके runBothFunc की तर्ज पर एक समारोह में समझा जा सकता है:

 def runInParallel(*fns): proc = [] for fn in fns: p = Process(target=fn) p.start() proc.append(p) for p in proc: p.join() runInParallel(func1, func2) 

गारंटी देने का कोई तरीका नहीं है कि दो फ़ंक्शन एक दूसरे के साथ सिंक्रनाइज़ेशन में निष्पादित हो जाएंगे जो कि आप क्या करना चाहते हैं।

सबसे अच्छा आप यह कर सकते हैं कि फ़ंक्शन को कई चरणों में विभाजित करना है, फिर Process.join तरह महत्वपूर्ण सिंक्रनाइज़ेशन बिंदुओं पर समाप्त होने के लिए दोनों की प्रतीक्षा करें।

यह समय से बेहतर है। time.sleep(10) क्योंकि आप सटीक समय की गारंटी नहीं दे सकते। स्पष्ट रूप से प्रतीक्षा के साथ, आप कह रहे हैं कि कार्य अगले चरण में जाने से पहले उस कदम को निष्पादित करने के लिए किया जाना चाहिए, यह मानकर यह 10ms के भीतर किया जाएगा जो मशीन पर और क्या चल रहा है इसके आधार पर गारंटी नहीं है।

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

http://python.6.x6.nabble.com/Multiprocessing-Pool-woes-td5047050.html

चूंकि मैं अजगर 3 का उपयोग कर रहा था, इसलिए मैंने इस कार्यक्रम को थोड़ा बदल दिया:

 from types import FunctionType import marshal def _applicable(*args, **kwargs): name = kwargs['__pw_name'] code = marshal.loads(kwargs['__pw_code']) gbls = globals() #gbls = marshal.loads(kwargs['__pw_gbls']) defs = marshal.loads(kwargs['__pw_defs']) clsr = marshal.loads(kwargs['__pw_clsr']) fdct = marshal.loads(kwargs['__pw_fdct']) func = FunctionType(code, gbls, name, defs, clsr) func.fdct = fdct del kwargs['__pw_name'] del kwargs['__pw_code'] del kwargs['__pw_defs'] del kwargs['__pw_clsr'] del kwargs['__pw_fdct'] return func(*args, **kwargs) def make_applicable(f, *args, **kwargs): if not isinstance(f, FunctionType): raise ValueError('argument must be a function') kwargs['__pw_name'] = f.__name__ # edited kwargs['__pw_code'] = marshal.dumps(f.__code__) # edited kwargs['__pw_defs'] = marshal.dumps(f.__defaults__) # edited kwargs['__pw_clsr'] = marshal.dumps(f.__closure__) # edited kwargs['__pw_fdct'] = marshal.dumps(f.__dict__) # edited return _applicable, args, kwargs def _mappable(x): x,name,code,defs,clsr,fdct = x code = marshal.loads(code) gbls = globals() #gbls = marshal.loads(gbls) defs = marshal.loads(defs) clsr = marshal.loads(clsr) fdct = marshal.loads(fdct) func = FunctionType(code, gbls, name, defs, clsr) func.fdct = fdct return func(x) def make_mappable(f, iterable): if not isinstance(f, FunctionType): raise ValueError('argument must be a function') name = f.__name__ # edited code = marshal.dumps(f.__code__) # edited defs = marshal.dumps(f.__defaults__) # edited clsr = marshal.dumps(f.__closure__) # edited fdct = marshal.dumps(f.__dict__) # edited return _mappable, ((i,name,code,defs,clsr,fdct) for i in iterable) 

इस फ़ंक्शन के बाद, उपरोक्त समस्या कोड को भी इस तरह बदल दिया जाता है:

 from multiprocessing import Pool from poolable import make_applicable, make_mappable def cube(x): return x**3 if __name__ == "__main__": pool = Pool(processes=2) results = [pool.apply_async(*make_applicable(cube,x)) for x in range(1,7)] print([result.get(timeout=10) for result in results]) 

और मुझे आउटपुट मिला है:

 [1, 8, 27, 64, 125, 216] 

मैं सोच रहा हूं कि यह पोस्ट कुछ विंडोज़ प्रयोक्ताओं के लिए उपयोगी हो सकती है