python - 保存线程/恢复线程的作用是什么?

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

如果您想了解更多信息,请告诉我。我尝试仅添加一些基础知识以避免使问题变得困惑。

谢谢。

最佳答案

该代码用于调用 C 函数,在本例中,函数为 PyEval_SaveThreadPyEval_RestoreThread

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

关于python - 保存线程/恢复线程的作用是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27615838/

相关文章:

python - 在 Django 中获取早于 10 天的数据库表数据

Python错误: need more than two values to unpack.请帮助我

ios - 同时更改 UILabel 文本和位置不起作用

java - BLAS.dgemm方法多线程计算误差

python - 连续出现的项目数

python - 如何从一个 numpy float 组创建一个 numpy 标签数组?

python - 如何获取列表中不包含在另一个列表中的 n 个元素?

python - django 1.7rc3 和 celery 3.13 - AppRegistryNotReady

c# - 为什么一个基本的单线程 C# 控制台应用程序需要 3 个线程?

python - 如何在 Debian 的 virtualenv 中安装 numpy?