2017-12-26 241 views
12

Şimdi Windows üzerinde çalışan C# uygulamasını geliştiriyorum. Pythonnet (.NET için Python) aracılığıyla çağrılan Python'da bazı işlemler yazılır. Süreçler hesaplama-ağırdır, bu yüzden bunları paralel olarak yapmak istiyorum.Windows için .NET için Python kullanarak çoklu işleme nasıl yapılır?

Bunlar CPU-sınırlı ve bağımsız olarak ele alınabilir.

olarak bildiğim kadarıyla, bunu gerçekleştirmek için 2 olası yolları vardır:

  1. başlatın birden Python çalışma zamanı
    ilk yolu birden Python tercümanlar başlatıyor ama olanaksız görünüyor. Pythonnet, statik yöntemle başlatılan yalnızca bir yorumlayıcıyı PythonEngine.Initialize() yöntemiyle yönetebilir. embedders için
    From the Python.NET documentation:

    Önemli Not: Python serbest parçacıklı değildir ve çok uçlu uygulamalarda Python yorumlayıcısı ile güvenle etkileşim kurmasını sağlamak amacıyla küresel bir tercüman kilit kullanır. Bununla ilgili daha fazla bilgi, www.python.org Web Sitesindeki Python C-API belgelerinde mevcuttur.
    Python'u yönetilen bir uygulamaya yerleştirirken, GIL'yi bir C veya C++ uygulamasında Python'u yerleştirirken yaptığınız gibi yönetmeniz gerekir.
    Python.Runtime ad alanı tarafından sağlanan herhangi bir nesne veya API ile etkileşim kurmadan önce, çağıran kod PythonEngine.AcquireLock yöntemini çağırarak Python global yorumlayıcı kilidini almış olmalıdır. Bu kuralın tek istisnası, GIL'i almadan, başlangıçta çağrılabilen PythonEngine.Initialize yöntemidir. Python
    başka bir yol içinde

  2. Kullanım çoklu işlem paketi çoklu işlem paketini kullanıyor. o .NET için gömülü beri
    if __name__ == "__main__":
    Ancak Python ile yazılmış fonksiyon modülünün bir parçası olarak alınır: Kod spawn sonlu süreci sağlamak için Windows üzerinde çalışıyorsa Python belgelerine göre, açıklamada şu gereklidir.
    Örneğin, aşağıdaki kod yürütülebilir, ancak süreçleri sonsuz olarak ortaya çıkar. Yukarıdaki sorunu çözmek için iyi bir fikir

//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()) 

var mı? Herhangi bir yorum takdir edilecektir. Şimdiden teşekkürler.

+0

ProcessPool 1 yerine ThreadPoolExecutor'ı kullanma hakkında ne düşünüyorsunuz? – Evk

+0

Sadece en az bir kez bahsetmek için - pyhton malzemelerinizi C# 'ye dönüştürmek ve kullanımı kolay Threadpools vb. Ile mutlu olmak mümkün mü? :) "süreçleri sonsuza kadar doğurur." Bu süreçlerde işlerini yapmak mı? Sh ** bitti mi? Eğer evet ise, tek sorunun, süreçlerin sonsuz yumurtlamasıdır. Soruyorum, çünkü neyin ters gittiğini tam olarak çözemedim (sonsuz süreçle yumurtlama dışında) –

+0

@ Evk Postada bahsettiğim gibi, hesaplama işlemi CPU sınırlıdır, bu yüzden ProcessPool uygundur çünkü ThreadPoolExecuter daha hızlı bir şekilde neden olamaz Python’un GIL’ine Lütfen bkz. Https://stackoverflow.com/questions/1226584/multiprocess-or-threading-in-python – sfb

cevap

2

Her bir python araması için, 1. Bir appDomain oluşturun 2. Python'u senkronize olmayan bir şekilde çalıştıracak appdomain'de bir görev oluşturun.

Ayrı Uygulama Alanları olduğundan, statik yöntemler bağımsız olacaktır.

Bir AppDomain kullanarak oluşturma işlemi ağırdır, bu nedenle sahip olduğunuz arama sayısı çok büyükse bunu yapamadım, ancak sanki senkronize olmayan bir şekilde çalıştırmak için az sayıda işleminiz olabilir.

+0

Şu ana kadar appDomain alanını bilmiyordum, teşekkürler. Çalışıyor gibi görünüyor, ama ne kadar çok işlemin son derece büyük olduğunu söyleyebilirim (tabii ki, bunun birçok faktöre bağlı olduğunu biliyorum). İyi gidip gitmediğini kontrol edeceğim. – sfb

+0

İnşallah ... karmaşık geliyor ... iyi şanslar – Ctznkane525

+0

işe yararsa, lütfen cevabı kabul edebilir misiniz? – Ctznkane525