Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 8, 2020 12:08:44

y_starynets
Зарегистрирован: 2019-04-11
Сообщения: 32
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа с потоками

Доброго времени суток. У меня есть несколько потоков. В каждом потоке считывается файл и записывается в базу. Всего 6 потоков и когда в 1 из них нет файла либо каталога скрипт прекращает работу.Как исправить ошибку когда у меня нет одного файла либо папки и пропустить этот поток и продолжить выполнение дальше? Код одного из потоков ниже

 def Firsta():
   
    file_dir = '/15 kHz (Noise)/'
    list_of_files = glob.glob('/15 kHz (Noise)/*')
    print(list_of_files)
    asx = str(list_of_files)
    latest_file = max(list_of_files, key=os.path.getctime)
    base = os.path.basename(latest_file)
    print(base)
    file_full = os.path.join(file_dir, base)
    
t1 = Thread(target=Firsta(), args=())
t1.start()
t1.join()
Спасибо!

Отредактировано y_starynets (Янв. 8, 2020 12:09:44)

Офлайн

#2 Янв. 8, 2020 12:20:15

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Работа с потоками

y_starynets
 t1 = Thread(target=Firsta(), args=())
Так оно вообще никак работать не будет



Отредактировано FishHook (Янв. 8, 2020 12:20:33)

Офлайн

#3 Янв. 8, 2020 12:26:05

y_starynets
Зарегистрирован: 2019-04-11
Сообщения: 32
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа с потоками

В смысле не будет? Сейчас же работает

Офлайн

#4 Янв. 8, 2020 12:43:03

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Работа с потоками

y_starynets
В смысле не будет? Сейчас же работает
Значит неправильно работает

 class Thread(_Verbose):
    """A class that represents a thread of control.
    This class can be safely subclassed in a limited fashion.
    """
    __initialized = False
    # Need to store a reference to sys.exc_info for printing
    # out exceptions when a thread tries to use a global var. during interp.
    # shutdown and thus raises an exception about trying to perform some
    # operation on/with a NoneType
    __exc_info = _sys.exc_info
    # Keep sys.exc_clear too to clear the exception just before
    # allowing .join() to return.
    __exc_clear = _sys.exc_clear
    def __init__(self, group=None, target=None, name=None,
                 args=(), kwargs=None, verbose=None):
        """This constructor should always be called with keyword arguments. Arguments are:
        *group* should be None; reserved for future extension when a ThreadGroup
        class is implemented.
        *target* is the callable object to be invoked by the run()
        method. Defaults to None, meaning nothing is called.
        *name* is the thread name. By default, a unique name is constructed of
        the form "Thread-N" where N is a small decimal number.
        *args* is the argument tuple for the target invocation. Defaults to ().
        *kwargs* is a dictionary of keyword arguments for the target
        invocation. Defaults to {}.
        If a subclass overrides the constructor, it must make sure to invoke
        the base class constructor (Thread.__init__()) before doing anything
        else to the thread.
"""

обратите внимание, что ожидается в виде target и что вы туда передаете



Офлайн

#5 Янв. 8, 2020 14:29:50

y_starynets
Зарегистрирован: 2019-04-11
Сообщения: 32
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа с потоками

в таргете я вызываю свою функцию для запуска

Офлайн

#6 Янв. 8, 2020 14:37:22

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Работа с потоками

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

 t1 = Thread(target=Firsta, args=())

сравните, есть огромная разница



Офлайн

#7 Янв. 8, 2020 14:43:27

y_starynets
Зарегистрирован: 2019-04-11
Сообщения: 32
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа с потоками

Спасибо, но честно говоря я не могу вас понять. Пойду еще разок перечитаю доки. Но и на этом спасибо.

Офлайн

#8 Янв. 8, 2020 14:59:34

marvellik
Зарегистрирован: 2016-05-15
Сообщения: 639
Репутация: +  73  -
Профиль   Отправить e-mail  

Работа с потоками

y_starynets простой пример :

 def fun():
    print('меня вызвали')
    return 'OK'
    
f = fun # f теперь ссылка на функцию
print(f,'\n') # выведет место хранения функции (объекта) в памяти
f_1 = fun() # f_1 ссылка на результат работы функции так как fun() это вызов функции
print(f_1,'\n')
f() # вызываем ф. по ссылке
print(f(),'\n') # вызываем и выводим результат
<function fun at 0x0239D6F0>

меня вызвали
OK

меня вызвали
меня вызвали
OK

>>>

Офлайн

#9 Янв. 8, 2020 15:44:04

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Работа с потоками

y_starynets
Вы создали функцию, которую хотите запустить в потоке. Создали объект потока и надеетесь, что этот объект обратится к операционной системе, которая выделит для него системные ресурсы и в некоторый известный ему момент времени запустит на выполнение вашу функцию. Объект Thread должен запустить вашу функцию, не вы сами при его создании. Если вы сами будете вызывать функцию, то никакой многопоточности не получится - все вычисления вы будете производить в главном потоке программы, там где создаете объекты класса Thread.



Офлайн

#10 Янв. 8, 2020 16:18:22

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Работа с потоками

Добавьте в код

 import time
def fun():
    print('меня вызвали')
    time.sleep(5)
    print('я закончила работу')
    return 'OK'

сразу увидите что выполнение идет последовательно.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version