На странице Python.Net https://github.com/pythonnet/pythonnet говорится:
Все вызовы python должны быть внутри блока using (Py.GIL()) {/* Здесь находится ваш код */}.
У меня есть приложение Python, которое вызывает .Net dll. .Net dll запускает новый поток, который выполняет некоторую работу, а затем вызывает обратно в Python. Если я оборачиваю обратный вызов в использование (Py.GIL()), то мой код печатает следующую ошибку, когда основной поток Python завершает работу:
Fatal Python error: auto-releasing thread-state, but no thread-state for this thread
Python runtime state: finalizing (tstate=00890970)
В моем коде обратный вызов все еще обрабатывается функцией python_callback после завершения основного потока Python. Я хочу, чтобы все останавливалось чисто, когда завершается основной поток Python.
Если я НЕ оборачиваю обратный вызов в использование (Py.GIL()), то он работает нормально. Итак, мой вопрос:
Нужно ли оборачивать обратный вызов из .Net в Python с помощью (Py.GIL())?
Если да: как мне избежать этого сообщения об ошибке?
Код Python:
import time
from datetime import datetime
import clr
clr.AddReference("System")
clr.AddReference(r"C:\MyDotNet\MyDotNet.dll")
import System
from MyDotNet import MyDotNetClass
def main():
print(datetime.now(), 'Python started')
dot_net_obj = MyDotNetClass(System.Action[System.Object](python_callback))
time.sleep(10)
print(datetime.now(), 'Python main thread finished')
def python_callback(arg):
print(datetime.now(), 'Python: In callback, arg =', arg)
time.sleep(20) # <-- to keep the callback running when the main thread finishes
if __name__ == '__main__':
main()
.Net-код:
using System;
using System.Threading;
using Python.Runtime;
namespace MyDotNet
{
public class MyDotNetClass
{
public MyDotNetClass(Delegate callback)
{
new Thread(() =>
{
Thread.Sleep(3000);
using (Py.GIL()) // <--- Is it safe to remove this 'using (Py.GIL())'?
{
object[] paramToPass = new object[1];
paramToPass[0] = "The C# work is done";
callback.DynamicInvoke(paramToPass);
}
}).Start();
}
}
}
И вот результат:
2020-11-23 10:10:30.168585 Python started
2020-11-23 10:10:33.191054 Python: In callback, arg = The C# work is done
2020-11-23 10:10:40.191273 Python main thread finished
Fatal Python error: auto-releasing thread-state, but no thread-state for this thread
Python runtime state: finalizing (tstate=00890970)
Использование Python 3.8, Python.Net 2.5.1, .Net Framework 4.6.1