Создание потоков в Python

Поскольку примитивные типы являются автобоксами, вызов getConstructor(java.lang.Class<?>... parameterTypes) завершится с ошибкой. Вам нужно будет вручную прокрутить доступные конструкторы. Если все типы совпадают, вы в порядке. Если некоторые типы не совпадают, но требуемый тип является примитивным И доступным типом является соответствующий класс-оболочка, тогда вы можете использовать этот конструктор. См. Ниже:

static <C> Constructor<C> getAppropriateConstructor(Class<C> c, Object[] initArgs){
    if(initArgs == null)
        initArgs = new Object[0];
    for(Constructor con : c.getDeclaredConstructors()){
        Class[] types = con.getParameterTypes();
        if(types.length!=initArgs.length)
            continue;
        boolean match = true;
        for(int i = 0; i < types.length; i++){
            Class need = types[i], got = initArgs[i].getClass();
            if(!need.isAssignableFrom(got)){
                if(need.isPrimitive()){
                    match = (int.class.equals(need) && Integer.class.equals(got))
                    || (long.class.equals(need) && Long.class.equals(got))
                    || (char.class.equals(need) && Character.class.equals(got))
                    || (short.class.equals(need) && Short.class.equals(got))
                    || (boolean.class.equals(need) && Boolean.class.equals(got))
                    || (byte.class.equals(need) && Byte.class.equals(got));
                }else{
                    match = false;
                }
            }
            if(!match)
                break;
        }
        if(match)
            return con;
    }
    throw new IllegalArgumentException("Cannot find an appropriate constructor for class " + c + " and arguments " + Arrays.toString(initArgs));
}
148
задан vinzee 28 June 2019 в 14:56
поделиться

4 ответа

Вам не нужно использовать подкласс Thread , чтобы эта работа работала - взгляните на простой пример, который я публикую ниже, чтобы узнать, как:

from threading import Thread
from time import sleep

def threaded_function(arg):
    for i in range(arg):
        print("running")
        sleep(1)


if __name__ == "__main__":
    thread = Thread(target = threaded_function, args = (10, ))
    thread.start()
    thread.join()
    print("thread finished...exiting")

Здесь я показываю, как использовать модуль потоковой передачи для создания потока, который вызывает обычную функцию в качестве своей цели. Вы можете увидеть, как я могу передать ему все необходимые аргументы в конструкторе потока.

297
ответ дан 23 November 2019 в 21:34
поделиться

Есть несколько проблем с вашим кодом:

def MyThread ( threading.thread ):
  • Вы не можете создать подкласс с функцией; только с классом
  • Если вы собираетесь использовать подкласс, вам нужен threading.Thread, а не threading.thread

Если вы действительно хотите сделать это только с функциями, у вас есть два варианта:

С threading:

import threading
def MyThread1():
    pass
def MyThread2():
    pass

t1 = threading.Thread(target=MyThread1, args=[])
t2 = threading.Thread(target=MyThread2, args=[])
t1.start()
t2.start()

С потоком:

import thread
def MyThread1():
    pass
def MyThread2():
    pass

thread.start_new_thread(MyThread1, ())
thread.start_new_thread(MyThread2, ())

Документ для thread.start_new_thread

39
ответ дан 23 November 2019 в 21:34
поделиться

Вы переопределили метод run ()? Если вы переопределили __ init __ , вы обязательно вызывали базовый threading.Thread .__ init __ () ?

После запуска двух потоков продолжает ли работать основной поток неограниченно / блокировать / присоединяться к дочерним потокам, чтобы выполнение основного потока не заканчивалось до того, как дочерние потоки завершили свои задачи?

И, наконец, получаете ли вы какие-либо необработанные исключения?

2
ответ дан 23 November 2019 в 21:34
поделиться

Вы можете использовать аргумент target в конструкторе Thread , чтобы напрямую передать вызываемую функцию вместо run .

3
ответ дан 23 November 2019 в 21:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: