Как назвать поток для регистрации с concurrent.futures? - PullRequest
0 голосов
/ 26 ноября 2018

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

ОБНОВЛЕНИЕ: решение реализовано в коде.Следуйте # линиям РЕШЕНИЯ

Сценарий был настроен следующим образом:

import logging
from queue import Queue, Empty
from threading import current_thread # SOLUTION
from concurrent.futures import ThreadPoolExecutor

logging.basicConfig(
    format='%(threadName)s %(levelname)s: %(message)s',
    level=logging.INFO
)


class Scraper:
    def __init__(self, max_workers):
        self.pool = ThreadPoolExecutor(max_workers = max_workers,  thread_name_prefix='T')
        self.to_crawl = Queue()
        for task in self.setup_tasks(tasks=max_workers):
            logging.info('Putting task to queue:\n{}'.format(task))
            self.to_crawl.put(task)
        logging.info('Queue size after init: {}'.format(self.to_crawl.qsize()))

    def setup_tasks(self, cur, tasks=1):
        # Prepare tasks for the queue

    def run_task(self, task):
        # Function for executing the task
        current_thread().name = task['id'] # SOLUTION
        logging.info('Executing task:\n{}'.format(task))
        id = task['id'] # I want the task id to be reflected in the logging function for when run_task runds

    def run_scraper(self):
        while True:
            logging.info('Launching new thread, queue size is {}'.format(self.to_crawl.qsize()))
            try:
                task = self.to_crawl.get()
                self.pool.submit(self.run_task, task)
            except Empty:
                break    

if __name__ == '__main__':
    s = Scraper(max_workers=3)
    s.run_scraper()

Я хотел бы добавить task['id'] в конфигурацию форматирования журнала вместо заданного %(threadName)s, не делая этого вручную каждый раз, когда скрипт регистрирует что-то в run_task

Есть ли способ присвоить task['id'] потоку %(threadName)s, когда поток принимает задачу в run_scraper

...