请帮助我..
我正在尝试从不同的C++线程调用Python脚本,但遇到了一些问题。
主函数:
Py_Initialize();
PyEval_InitThreads();
PyThreadState *mainThreadState = PyThreadState_Get();
PyEval_ReleaseLock();
PyInterpreterState *mainInterpreterState = mainThreadState->interp;
...
//creating threads with myThreadState per thread
PyEval_AcquireLock();
PyThreadState *myThreadState = PyThreadState_New(mainInterpreterState);
PyEval_ReleaseLock();
//running threads
...
PyEval_RestoreThread(mainThreadState);
Py_Finalize();
在线程对象中的run()函数:
PyEval_AcquireLock();
PyThreadState_Swap(m_threadState);
...
script = "f = open('file_for_this_thread','w')\n"
"print f\n"
"f.write('111')\n"
"print f.fileno()\n"
PyRun_SimpleString( script );
...
PyThreadState_Swap(NULL);
PyEval_ReleaseLock();
'print f'会显示每个文件的正确信息,但是有些地方出了问题,因为第二个 'print f' 会打印不同线程相同的输出,并且输出(如果有的话)将会写入一个文件而不是每个线程对应一个文件。
如果我用 time.sleep(1) 替换 f.write,那么文件处理器也会变成相等的。但是没有崩溃发生。
我也尝试过使用 PyGILState_Ensure/PyGILState_Release,但是效果一样。
主函数:
Py_Initialize();
PyEval_InitThreads();
PyThreadState* mainThreadState = PyEval_SaveThread();
...
//creating and running threads
...
PyEval_RestoreThread(mainThreadState);
Py_Finalize();
储物柜:
TPyScriptThreadLocker:
PyGILState_STATE m_state;
public:
TPyScriptThreadLocker(): m_state(PyGILState_Ensure() {}
~TPyScriptThreadLocker() { PyGILState_Release(m_state); }
线程对象中的run()函数:
TPyScriptThreadLocker lock;
...
script = "f = open('file_for_this_thread','w')\n"
"print f.fileno()\n"
"f.write('111')\n"
"print f.fileno()\n"
PyRun_SimpleString( script );
我知道在大多数情况下,Python中的多线程不是好主意,但现在我想知道这段代码有什么问题...
Python 2.7
来源: http://www.linuxjournal.com/article/3641?page=0,2
源代码: http://files.mail.ru/9D4TEF pastebin: http://pastebin.com/DfFT9KN3
'file_for_this_thread'
。那个文件名是怎么确定的呢? - jogojapanf
被Python解释器视为全局变量,并在所有线程之间共享。毕竟,所有线程都使用同一个解释器实例。 - jogojapan