Ş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: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çindeKullanı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.
ProcessPool 1 yerine ThreadPoolExecutor'ı kullanma hakkında ne düşünüyorsunuz? – Evk
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) –
@ 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