Форум сайта python.su
0
Доброго времени суток. У меня есть несколько потоков. В каждом потоке считывается файл и записывается в базу. Всего 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)
Офлайн
568
y_starynetsТак оно вообще никак работать не будетt1 = Thread(target=Firsta(), args=())
Отредактировано FishHook (Янв. 8, 2020 12:20:33)
Офлайн
0
В смысле не будет? Сейчас же работает
Офлайн
568
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. """
Офлайн
0
в таргете я вызываю свою функцию для запуска
Офлайн
568
y_starynetsА с чего вы взяли, что её надо вызывать? Какой в этом смысл. Вы с равным успехом можете передать в класс результат функции. Как поток будет работать? Вы не результат должны передавать, а саму функцию
в таргете я вызываю свою функцию для запуска
t1 = Thread(target=Firsta, args=())
Офлайн
0
Спасибо, но честно говоря я не могу вас понять. Пойду еще разок перечитаю доки. Но и на этом спасибо.
Офлайн
73
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') # вызываем и выводим результат
Офлайн
568
y_starynets
Вы создали функцию, которую хотите запустить в потоке. Создали объект потока и надеетесь, что этот объект обратится к операционной системе, которая выделит для него системные ресурсы и в некоторый известный ему момент времени запустит на выполнение вашу функцию. Объект Thread должен запустить вашу функцию, не вы сами при его создании. Если вы сами будете вызывать функцию, то никакой многопоточности не получится - все вычисления вы будете производить в главном потоке программы, там где создаете объекты класса Thread.
Офлайн
253
Добавьте в код
import time def fun(): print('меня вызвали') time.sleep(5) print('я закончила работу') return 'OK'
Офлайн