savethread / restore线程有什么作用?

时间:2014-12-23 07:23:59

标签: python multithreading numpy numba

这是这个问题的后续跟进:

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),从而覆盖结果。

如果您想了解更多信息,请告诉我。我试图只添加一些基础知识,以避免混淆问题。

谢谢。

1 个答案:

答案 0 :(得分:2)

该代码用于调用C函数,在这种情况下,函数为PyEval_SaveThreadPyEval_RestoreThread

savethread = pythonapi.PyEval_SaveThread在变量pythonapi.PyEval_SaveThread中保留对函数savethread的引用,这样当您稍后使用savethread()调用该函数时,就好像您调用了pythonapi.PyEval_SaveThread()一样1}}。

restypeargtypes分别为返回值和参数值定义了预期的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,这意味着从调用该函数获得的返回值将被解释为指针。在这种情况下,重要的是指针只是一个整数,但指针类型意味着这是一个整数是一个内存地址(可能是我猜的一个线程)。