Вопрос

I'm trying to use the StoppableThread class presented as an answer to another question:

import threading

# Technique for creating a thread that can be stopped safely
# Posted by Bluebird75 on StackOverflow
class StoppableThread(threading.Thread):
    """Thread class with a stop() method. The thread itself has to check
    regularly for the stopped() condition."""

    def __init__(self):
        super(StoppableThread, self).__init__()
        self._stop = threading.Event()

    def stop(self):
        self._stop.set()

    def stopped(self):
        return self._stop.isSet()

However, if I run something like:

st = StoppableThread(target=func)

I get:

TypeError: __init__() got an unexpected keyword argument 'target'

Probably an oversight on how this should be used.

Это было полезно?

Решение

The StoppableThread class does not take or pass any additional arguments to threading.Thread in the constructor. You need to do something like this instead:

class StoppableThread(threading.Thread):
    """Thread class with a stop() method. The thread itself has to check
    regularly for the stopped() condition."""

    def __init__(self,*args,**kwargs):
        super(threading.Thread,self).__init__(*args,**kwargs)
        self._stop = threading.Event()

This will pass both positional and keyword arguments to the base class.

Другие советы

You are overriding init and your init doesn't take any arguments. You should add a "target" argument and pass it through to your base class constructor with super or even better allow arbitrary arguments via *args and *kwargs.

I.e.

def __init__(self,*args,**kwargs):
    super(threading.Thread,self).__init__(*args,**kwargs)
    self._stop = threading.Event()
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top