【问题标题】:Cython3 Using Threading.Thread with args inside the classCython3 在类中使用带有 args 的 Threading.Thread
【发布时间】:2018-01-29 10:33:36
【问题描述】:

Cython,支持我解决这个错误...我已经展示了我的代码中生成的示例代码和错误。我正在使用 Anaconda3 最新的 Windows 发行版,如何在类中使用带有 args 的线程

#cytest.pyx
from threading import Thread

cdef class t(object):

    cdef int a,b,nthreads
    cpdef readonly list retlist

    def __init__(self,int nthreads,int a=10,int b=10):
        self.a = a
        self.b = b
        self.retlist = []
        self.nthreads = nthreads

    cdef mul(self,int c,int d):
        cdef int n
        n = (self.a*c)+(self.b*d)
        self.retlist.append(n)

    cpdef run_mul(self):
        cdef int i
        cdef object Thd
        for i in range(self.nthreads):
           Thd = Thread(target=self.mul, args=(10,20))
           # Note: I got error in above arguments
           Thd.start()

上面的文件 cytest.pyx 编译和导入如下..

import cytest
ts = cytest.t(4)

运行以下代码时出现如下错误

ts.run_mul()

错误如下......如何在cython中解决这个问题

Exception in thread Thread-11:
Traceback (most recent call last):
File "C:\ProgramData\Anaconda3\lib\threading.py", line 916, in 
_bootstrap_inner
self.run()
File "C:\ProgramData\Anaconda3\lib\threading.py", line 864, in run
self._target(*self._args, **self._kwargs)
File "stringsource", line 65, in 
cfunc.to_py.__Pyx_CFunc_object____t____int____int___to_py.wrap
TypeError: wrap() takes exactly 3 positional arguments (2 given)

Exception in thread Thread-13:
Traceback (most recent call last):
File "C:\ProgramData\Anaconda3\lib\threading.py", line 916, in 
_bootstrap_inner
self.run()
File "C:\ProgramData\Anaconda3\lib\threading.py", line 864, in run
self._target(*self._args, **self._kwargs)
File "stringsource", line 65, in 
cfunc.to_py.__Pyx_CFunc_object____t____int____int___to_py.wrap
TypeError: wrap() takes exactly 3 positional arguments (2 given)

Exception in thread Thread-12:
Traceback (most recent call last):
File "C:\ProgramData\Anaconda3\lib\threading.py", line 916, in 
_bootstrap_inner
self.run()
File "C:\ProgramData\Anaconda3\lib\threading.py", line 864, in run
self._target(*self._args, **self._kwargs)
File "stringsource", line 65, in 
cfunc.to_py.__Pyx_CFunc_object____t____int____int___to_py.wrap
TypeError: wrap() takes exactly 3 positional arguments (2 given)

Exception in thread Thread-10:
Traceback (most recent call last):
File "C:\ProgramData\Anaconda3\lib\threading.py", line 916, in 
_bootstrap_inner
self.run()
File "C:\ProgramData\Anaconda3\lib\threading.py", line 864, in run
self._target(*self._args, **self._kwargs)
File "stringsource", line 65, in 
cfunc.to_py.__Pyx_CFunc_object____t____int____int___to_py.wrap
TypeError: wrap() takes exactly 3 positional arguments (2 given)

【问题讨论】:

    标签: python-3.x cython python-multithreading


    【解决方案1】:

    创建函数def 而不是cdef

    想想你为什么要创建一个函数cdef 会有所帮助。 cdef 函数的唯一真正区别是您说它只能在 C 级别调用,因此您可以避免 Python 调用机制。在这种情况下,您试图将其作为可调用的 Python 对象传递给 Python 函数,这完全没有意义。

    (Cython 尝试通过用 Python 层包装它来帮助您,但这有点错误,并且不能正确处理绑定的 self。您可能希望在 @987654321 将其报告为错误@.)

    【讨论】:

    • 我可以将 self 作为括号内的参数设置为 ..args = (self,10,20)。它在我的试验中对我有用
    • 也许吧。但只需使用def 函数。绝对没有理由不这样做。 cdef 在这种情况下不会更快。
    • @endermaz 我建议你问一个新问题。我不明白为什么它不起作用,但 Cython + 线程可能会出现并发症(主要是它不会自行释放 GIL,除非提示)
    猜你喜欢
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-29
    • 1970-01-01
    • 1970-01-01
    • 2016-04-03
    相关资源
    最近更新 更多