这是这个问题的后续跟进:
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
),从而覆盖结果。
如果您想了解更多信息,请告诉我。我试图只添加一些基础知识,以避免混淆问题。
谢谢。
答案 0 :(得分:2)
该代码用于调用C函数,在这种情况下,函数为PyEval_SaveThread
和PyEval_RestoreThread
。
savethread = pythonapi.PyEval_SaveThread
在变量pythonapi.PyEval_SaveThread
中保留对函数savethread
的引用,这样当您稍后使用savethread()
调用该函数时,就好像您调用了pythonapi.PyEval_SaveThread()
一样1}}。
restype
和argtypes
分别为返回值和参数值定义了预期的C类型。 restype
属性必须始终设置为单个C类型(或None
),并且argtypes
属性必须始终设置为C类型的列表(或元组)。这些应设置为C函数接受并返回严格类型(而Python函数不是严格类型)。例如。 savethread.restype = c_void_p
表示,当您致电savethread()
时,预期的返回类型将属于C类型void *
。
有关更多信息,请阅读the ctypes docs.
不是一个完整的答案,但希望有所帮助。
编辑: argtypes和restype定义参数并返回它们所归属的函数的类型。 Argtypes始终是一个列表,返回类型是单个项目。
E.g。对于savethread,没有参数,因此参数类型列表为空。返回类型是c_void_p,这意味着从调用该函数获得的返回值将被解释为指针。在这种情况下,重要的是指针只是一个整数,但指针类型意味着这是一个整数是一个内存地址(可能是我猜的一个线程)。