这是此问题的跟进:
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
在变量pythonapi.PyEval_SaveThread
中保留了对函数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,这意味着您从调用该函数获得的返回值将被解释为指针。在这种情况下很重要,因为指针将只是一个整数,但是指针类型意味着该整数是一个内存地址(可能是我猜到的线程)。