这是此问题的跟进:

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_SaveThreadPyEval_RestoreThread
savethread = pythonapi.PyEval_SaveThread在变量pythonapi.PyEval_SaveThread中保留了对函数savethread的引用,因此,当您以后使用savethread()调用该函数时,就好像您在调用pythonapi.PyEval_SaveThread()一样。
restypeargtypes分别为返回值和参数值定义了预期的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,这意味着您从调用该函数获得的返回值将被解释为指针。在这种情况下很重要,因为指针将只是一个整数,但是指针类型意味着该整数是一个内存地址(可能是我猜到的线程)。

10-05 18:59