这是这个问题的后续:
When does a numba function compile?
我对这部分代码的作用感到困惑:
from ctypes import pythonapi, c_void_p
savethread = pythonapi.PyEval_SaveThread
savethread.argtypes = []
savethread.restype = c_void_p
restorethread = pythonapi.PyEval_RestoreThread
restorethread.argtypes = [c_void_p]
restorethread.restype = None
什么是 savethread/restorethreads 和 argtypes/restypes?
我在这里读了一点:
https://docs.python.org/2/c-api/init.html#thread-state-and-the-global-interpreter-lock
但说实话,我迷失了......
动机 这个问题的动机是我尝试实现与此示例类似的东西:
http://numba.pydata.org/numba-doc/0.15.1/examples.html#multi-threading
但我没有传递“结果”列表或指针,而是使用 numpy 数组。
result = np.zeros([N1, N2, Nthreads], dtype=np.float)
然后调用该函数:
(result[:,:,iThread],) + args
作为参数,但写入该位置似乎出现一些崩溃。即,iThread
的某些结果最终位于不同的位置(我们称之为 iThread2
),从而覆盖结果。
如果您想了解更多信息,请告诉我。我尝试仅添加一些基础知识以避免使问题变得困惑。
谢谢。
最佳答案
该代码用于调用 C 函数,在本例中,函数为 PyEval_SaveThread
和 PyEval_RestoreThread
。
savethread = pythonapi.PyEval_SaveThread
在变量 savethread
中保留对函数 pythonapi.PyEval_SaveThread
的引用,这样当您调用稍后使用 savethread()
调用该函数,就像调用 pythonapi.PyEval_SaveThread()
一样。
restype
和 argtypes
分别定义返回值和参数值的预期 C 类型。 restype
属性必须始终设置为单个 C 类型(或 None
),并且 argtypes
属性必须始终设置为列表(或C 类型的元组)。这些应该设置为 C 函数接受并返回严格类型(而 Python 函数不是严格类型的)。例如。 savethread.restype = c_void_p
表示调用 savethread()
时的预期返回类型将为 C 类型 void *
。
如需了解更多信息,请阅读 the ctypes docs.
不是一个完整的答案,但希望有所帮助。
编辑: argtypes 和 restype 定义它们所属函数的参数和返回类型。 Argtypes 始终是一个列表,返回类型是单个项目。
例如对于 savethread 没有参数,因此参数类型列表为空。返回类型是c_void_p,这意味着调用该函数获得的返回值将被解释为指针。在这种情况下,这一点很重要,因为指针只是一个整数,但指针类型意味着这是一个整数,是一个内存地址(我猜可能是一个线程)。
关于python - 保存线程/恢复线程的作用是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27615838/