2017-12-26 83 views
12

अब मैं विंडोज़ पर चल रहे सी # ऐप का विकास कर रहा हूं। कुछ प्रक्रियाओं को पायथन में लिखा गया है, जिसे पायथननेट (.NET के लिए पायथन) के माध्यम से बुलाया जाता है। प्रक्रियाएं गणना-भारी हैं, इसलिए मैं उन्हें समानांतर में करना चाहता हूं।विंडोज़ पर .NET के लिए पाइथन का उपयोग करके मल्टीप्रोसेसिंग कैसे करें?

वे सीपीयू-बाध्य हैं और उन्हें स्वतंत्र रूप से संभाला जा सकता है।

जहाँ तक मुझे पता है, वहाँ 2 संभव तरीके यह महसूस करने के लिए कर रहे हैं:

  1. लॉन्च कई अजगर क्रम
    पहला तरीका कई अजगर दुभाषिए लॉन्च कर रहा है, लेकिन यह अव्यावहारिक लगता है। क्योंकि पाइथननेट स्पष्ट रूप से केवल एक दुभाषिया का प्रबंधन कर सकता है जो स्थिर विधि द्वारा प्रारंभिक रूप से प्रारंभ किया जाता है, PythonEngine.Initialize()। embedders के लिए
    From the Python.NET documentation:

    महत्वपूर्ण नोट: अजगर मुक्त-थ्रेडेड नहीं है और मल्टी-थ्रेडेड अनुप्रयोगों पायथन दुभाषिया के साथ सुरक्षित रूप बातचीत करने के लिए अनुमति देने के लिए एक वैश्विक दुभाषिया ताला उपयोग करता है। इसके बारे में अधिक जानकारी www.python.org वेबसाइट पर पायथन सी-एपीआई दस्तावेज़ में उपलब्ध है।
    एक प्रबंधित अनुप्रयोग में पायथन को एम्बेड करते समय, आपको जीआईएल को उसी तरह से प्रबंधित करना होगा जब आप सी या सी ++ एप्लिकेशन में पायथन को एम्बेड करते समय करेंगे।
    पायथन द्वारा प्रदान की गई किसी भी ऑब्जेक्ट या एपीआई के साथ बातचीत करने से पहले। रनटाइम नेमस्पेस, कॉलिंग कोड को पायथनऑनलाइन.एक्वायर लॉक विधि को कॉल करके पाइथन ग्लोबल दुभाषिया लॉक प्राप्त करना होगा। इस नियम का एकमात्र अपवाद PythonEngine है। प्रारंभिक विधि, जिसे जीआईएल हासिल किए बिना स्टार्टअप पर बुलाया जा सकता है। अजगर
    अन्य तरीके से

  2. उपयोग बहु पैकेज बहु पैकेज का उपयोग कर रहा है।
    if __name__ == "__main__":
    हालांकि, समारोह अजगर में लिखा मॉड्यूल के एक भाग के रूप में लिया जाता है, क्योंकि यह नेट को एम्बेड किया गया है: अजगर प्रलेखन के अनुसार, निम्नलिखित बयान करता है, तो कोड अंडे परिमित प्रक्रिया सुनिश्चित करने के लिए Windows पर चलाता है आवश्यक है।
    उदाहरण के लिए, कोड कोड निष्पादन योग्य है, लेकिन स्पॉन प्रक्रिया असीम रूप से होती है।

//C# 
static void Main(string[] args) 
    { 
     using (Py.GIL()) 
     { 
      PythonEngine.Exec(
       "print(__name__)\n" + //output is "buitlins" 
       "if __name__ == 'builtins':\n" + 
       " import test_package\n" + //import Python code below 
       " test_package.async_test()\n" 
       ); 
     } 
    } 
# Python 
import concurrent.futures 

def heavy_calc(x): 
    for i in range(int(1e7) * x): 
     i*2 

def async_test(): 
    # multiprocessing 
    with concurrent.futures.ProcessPoolExecutor(max_workers=8) as executor: 
     futures = [executor.submit(heavy_calc,x) for x in range(10)] 
     (done, notdone) = concurrent.futures.wait(futures) 
     for future in futures: 
      print(future.result()) 

वहाँ ऊपर समस्या को हल करने अच्छा विचार है? किसी भी टिप्पणी की सराहना की जाएगी। अग्रिम में धन्यवाद।

+0

ProcessPool के बजाय ThreadPoolExecutor का उपयोग करने के बारे में क्या? – Evk

+0

बस इसे कम से कम एक बार उल्लेख किया गया है - क्या यह आपके पायथन सामान को सी # में स्थानांतरित करने की संभावना है और थ्रेडपूल आदि का उपयोग करने में आसान है? :) "स्पॉन प्रक्रिया असीम रूप से।" इन प्रक्रियाओं को कम से कम अपनी नौकरियां करते हैं? क्या उन्हें sh ** किया जाता है? यदि हां, तो आपकी एकमात्र समस्या यह है कि प्रक्रियाओं के अंतहीन स्पॉन। मैं पूछ रहा हूं, क्योंकि मैंने गलत क्या किया है (अनंत प्रक्रिया स्पॉन के अलावा) –

+0

@Evk जैसा कि मैंने पोस्ट में उल्लेख किया है, गणना प्रक्रिया सीपीयू-बाध्य है, इसलिए ProcessPool उपयुक्त है क्योंकि ThreadPoolExecuter इसे तेज़ी से नहीं बना सकता पायथन के जीआईएल के लिए। कृपया https://stackoverflow.com/questions/1226584/multiprocess-or-threading-in-python – sfb

उत्तर

2

प्रत्येक पायथन कॉल के लिए, 1. एक ऐपडोमेन बनाएं 2. ऐपडोमेन में एक कार्य बनाएं जो पाइथन को असीमित रूप से चलाएगा।

चूंकि यह अलग-अलग ऐपडोमेन है, इसलिए स्थिर विधियां स्वतंत्र होंगी।

एक का उपयोग कर एक AppDomain भारी है, इसलिए मैं यह नहीं कर सकता है अगर कॉल की संख्या के बहुत बड़ी है, लेकिन यह लगता है कि आप बस अतुल्यकालिक रूप से चलाने के लिए प्रक्रियाओं की एक छोटी संख्या हो सकता है बना रहा है।

+0

मुझे अभी तक ऐपडोमेन नहीं पता था, धन्यवाद। ऐसा लगता है कि काम करता है, लेकिन मुझे यकीन नहीं है कि कितनी प्रक्रियाएं बहुत बड़ी हैं (बेशक, मुझे पता है कि यह कई कारकों पर निर्भर करता है)। मैं जांच करूंगा कि यह ठीक है या नहीं। – sfb

+0

मुझे आशा है कि ... जटिल लगता है ... शुभकामनाएं – Ctznkane525

+0

यदि यह काम करता है, तो क्या आप उत्तर स्वीकार कर सकते हैं? – Ctznkane525

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