Найти - Пользователи
Полная версия: Работа с потоками
Начало » Python для новичков » Работа с потоками
1 2
y_starynets
Доброго времени суток. У меня есть несколько потоков. В каждом потоке считывается файл и записывается в базу. Всего 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()
Спасибо!
FishHook
y_starynets
 t1 = Thread(target=Firsta(), args=())
Так оно вообще никак работать не будет
y_starynets
В смысле не будет? Сейчас же работает
FishHook
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 и что вы туда передаете
y_starynets
в таргете я вызываю свою функцию для запуска
FishHook
y_starynets
в таргете я вызываю свою функцию для запуска
А с чего вы взяли, что её надо вызывать? Какой в этом смысл. Вы с равным успехом можете передать в класс результат функции. Как поток будет работать? Вы не результат должны передавать, а саму функцию

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

сравните, есть огромная разница
y_starynets
Спасибо, но честно говоря я не могу вас понять. Пойду еще разок перечитаю доки. Но и на этом спасибо.
marvellik
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

>>>
FishHook
y_starynets
Вы создали функцию, которую хотите запустить в потоке. Создали объект потока и надеетесь, что этот объект обратится к операционной системе, которая выделит для него системные ресурсы и в некоторый известный ему момент времени запустит на выполнение вашу функцию. Объект Thread должен запустить вашу функцию, не вы сами при его создании. Если вы сами будете вызывать функцию, то никакой многопоточности не получится - все вычисления вы будете производить в главном потоке программы, там где создаете объекты класса Thread.
doza_and
Добавьте в код
 import time
def fun():
    print('меня вызвали')
    time.sleep(5)
    print('я закончила работу')
    return 'OK'

сразу увидите что выполнение идет последовательно.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB