如何在使用(Py.GIL())块pythonnet时处理异常

时间:2017-03-13 08:29:10

标签: c# python .net multithreading python.net

有没有办法在使用(Py.GIL())块时处理异常?

例如:

   using System;
   using Python.Runtime;

   public class Test{
        public static void Main(){
           using(Py.GIL()){
               try{
                   dynamic module = Py.Import("module");
                   dynamic result = module.function("argument");

                   Console.WriteLine(result);
               }
               catch(Excepiton ex){
                   // Handled Exception
               }
           }
        }
    }

我问了这个问题因为,我调用了使用using(Py.GIL())块的C#函数。它使用主线程等待完成的新线程执行。它适用于第一轮,但是对于下一轮,它会停在using block上并且应用程序冻结而不显示任何异常。

我甚至试图阻止主线程等待执行,但所有工作线程执行仍然在第一轮后using block Py.GIL()停止。

对于线程执行我正在使用线程池。

Thread.Factory.StartNew(FunctionName);

1 个答案:

答案 0 :(得分:3)

此问题是由于Python处理线程的方式。 主线程必须初始化Python引擎和允许线程。

PythonEngine.Initialize();
PythonEngine.BeginAllowThreads();

在使用using(Py.GIL()) block的工作线程之前,在主线程上运行上面的代码。