def direct_order(): """ task_num: номер задания передается строкой типа '0001-0646' номера задач передается списком типа ['0001-0646-0001','0001-0646-0002','0001-0646-0003'] :return: """ task_num = '0001-0661' # task_num = ['0001-0661-0036', '0001-0661-0035'] for_connect = 'DRIVER={SQL Server};SERVER=10.199.13.57;DATABASE=rway;UID=vdorofeev;PWD=VD12345#' #Настройки подключения к базе RWAY, будет использовано для подключения в синхронной и асинхронной функциях # prepare_data - Получение списка задач в задании с некоторыми предварительными хар-ками, или по списку задач получения предварительных хар-к prepare_data = pasing_verification_char.task_list_prepare( task_num=task_num, for_connect=for_connect) # pasing_verification_char.excluding_task - Из предварительного списка задач отфильровываются задачи запущенные несколько раз # (задачи запущенные по одному и тому же источнику, берутся задачи с максимальным количество спарсенных предложений) # Там же выводится небольшая статистика по ззадачам и записывается в фал небольшой лог (в котором указывается сколько задач и с каким статусом на данный момент в данном задании) #pasing_verification_char.main - Запуск основной асинхронной функции парсинга filtered_prepare_data = pasing_verification_char.excluding_task( prepare_data) pasing_verification_char.main(filtered_prepare_data, for_connect) cprint('Файл с результатами парсинга:', 'yellow', end=' '), print( pasing_verification_char.file_path_of_result_data[0]) try: with open(pasing_verification_char.file_path_of_result_data[0], 'r', encoding='utf-8') as fp: for_print = json.load(fp) except Exception as e: cprint(f'Ошибка открытия файла с результатами парсинга: {e}', 'red') try: pasing_print.main(for_print) except Exception as e: cprint(f'Ошибка в модуле pasing_print: {e}', 'red')
async def gobaby(task_list_prepare_data, for_connect): ''' Основная асинхронная функиця создания и запуска других асинхронных функций получения данных по задачам (в формате async). Пришлось создать эту задачу, а не осуществлять данный код в функции main потому, что в main присутствует вызов обычной (синхронной) функции task_list_prepare для предварительного получения списка задач. В таком случае main не может быть асинхронной а как следствие не может создать и запустить другие асинхронные функции. Либо необходимо единственныю синхронную функцию тоже делать условно асинхронной (что, как бы не нужно по сути, она должна выполнится первой и выполняется достаточно быстро) :param task_list_prepare_data: Список всех задач парсинга (Иначе они называются задачи ИМПОРТА) :param for_connect: Настройки для подключения к базе данных :return: Ничего не возвращает ''' begin = time.time() #условное время начала запуска скрипта futures = [ task_full_info(args, for_connect) for args in task_list_prepare_data ] #созадниае списка фьючерсов (функций, которые будут выполнены в асинхронном режиме) #Это и есть те финкии, которые будут получать данные о качестве заполняемости по каждой задаче #В качестве аргументов передается параметры одной задачи из списка задач и свойства подключения в базе данных done, _ = await asyncio.wait(futures) #Запуск всех ФУТУР !!! for_output = [ ] #Список в котором будут собираться результаты, формат - СПИСОК СЛОВАРЕЙ for future in done: #Если футура выполнена try: for_output.append( future.result() ) #В результирующий список добавляются результат выполнения футуры except Exception as e: cprint(('Ошибка вот такая', e), 'red') cprint( (f'Общее время выполнения всех задач = {(time.time() - begin):.1f}' + ' сек'), 'green') #Запись всех результатов полученных выше в файл json и указанием даты и времени в имени файла time_now = (datetime.datetime.now().strftime("%Y-%m-%d %H-%M-%S")) with open( r'C:\Users\user1\AppData\Roaming\JetBrains\PyCharmCE2020.1\scratches\parse_resilt_items\async_items_({}).json' .format(time_now), 'w', encoding='utf-8') as fp: json.dump(for_output, fp, ensure_ascii=False, indent=4) print( r'Файл записан в C:\Users\user1\.PyCharmCE2019.3\config\scratches\async_items_({}).json' .format(time_now)) try: pasing_print.main(for_output) except Exception as e: cprint(f'Ошибка в модуле pasing_print вот такая {e}', 'red')
def direct_order(): """ Оснавная функция упорядочивания получения статистических данных. TASK_NUM - номер задания. берется из файла конфига или из командной строки если этот файл запускался так (python parsing_manage.py 0001-0771). Оба варианта работа востребованы (из скрипта parse_monitor). 1)prepare_data - Получение списка задач в задании с некоторыми предварительными хар-ками, или по списку задач получения предварительных хар-к 2)filtered_prepare_data - Из предварительного списка задач отфильровываются задачи запущенные несколько раз, (задачи запущенные по одному и тому же источнику, берутся задачи с максимальным количество спарсенных предложений) 3)pasing_verification_char.main - Запуск основной асинхронной функции парсинга статистических данных Результат формирования статистических данных записывается в файл в папке "parse_result", имя файла это номер задачи (формат JSON). 4) Печать статистических данных в консоль через модуль pasing_print номер задания передается строкой типа '0001-0646' номера задач передается списком типа ['0001-0646-0001','0001-0646-0002','0001-0646-0003'] :return: ничего не возвращает, но формирует файл """ try: task_from_cmd = sys.argv[ 1] # Нати переданнные в командной строке аргументы при запуске (номер задания) except: task_from_cmd = False # Если В командной строке номер задания не передавался TASK_NUM = task_from_cmd if task_from_cmd else CONFIG.TASK_NUM # Если номер задания передан в командной строке, иначе из конфига prepare_data = pasing_verification_char.task_list_prepare( task_num=TASK_NUM, for_connect=CONFIG.FOR_CONNECT) filtered_prepare_data = pasing_verification_char.excluding_task( prepare_data) pasing_verification_char.main(filtered_prepare_data, CONFIG.FOR_CONNECT) cprint('Файл с результатами парсинга:', 'yellow', end=' ') if CONFIG.PRINT_ALLTASK_STATISTIC: #Печать статистических данных в консоль через модуль pasing_print try: print(pasing_verification_char.file_path_of_result_data[0]) with open(pasing_verification_char.file_path_of_result_data[0], 'r', encoding='utf-8') as fp: for_print = json.load(fp) #Считывание файла except Exception as e: cprint(f'Ошибка открытия файла с результатами парсинга: {e}', 'red') pasing_print.main(for_print) #печать через модуль
loop.close() #закрытия планировщика задач после выполнения #Запись файла с результатами парсинга file_path=r'C:\Users\user1\Desktop\pasing_verification_RWAY\add_manage\parse_result\{}.json'.format(file_path_of_result_data.pop()) with open(file_path, 'w', encoding='utf-8') as fp: json.dump(for_output, fp, ensure_ascii=False, indent=4) file_path_of_result_data.append(file_path) #Путь к результирующему файлу для печати if __name__ == "__main__": #Для отладки task_num = '0001-0661' # task_num = ['0001-0649-0014'] # for_connect = 'DRIVER={SQL Server};SERVER=10.199.13.60;DATABASE=rway;UID=vdorofeev;PWD=Sql01' #Настройки подключения к базе RWAY, будет использовано для подключения в синхронной и асинхронной функциях for_connect = 'DRIVER={SQL Server};SERVER=10.199.13.57;DATABASE=rway;UID=vdorofeev;PWD=VD12345#' # Настройки подключения к базе RWAY, будет использовано для подключения в синхронной и асинхронной функциях """ Нельзя передавать одно подключение в потоки (aioodbc.connect(dsn=for_connect) или pyodbc.connect(for_connect)), первый поток выполнится а другие скажут что соединение занято Нельзя передавать в потоки один курсор (conn.cursor()), первый поток выполнится а другие сойдут с ума т.к. курсор переместится в первом потоке Но можно передать простую строку настроек которая будет использована при каждом подключении к серверу SQL """ prepare_data = task_list_prepare(task_num= task_num ,for_connect = for_connect) # получение перечня всех задач входящих в задание (в синхронном формате, потому что быстро) main(prepare_data,for_connect) import pasing_print with open(file_path_of_result_data[0], 'r', encoding='utf-8') as fp: for_print=json.load(fp) try: pasing_print.main(for_print) except Exception as e: cprint(f'Ошибка в модуле pasing_print вот такая {e}','red')