o
    "F5j                     @   sn   d dl Z d dlZd dlZd dlmZmZ d dlmZmZ d dl	m	Z	 ej
ejd eeZG dd dZdS )    N)ThreadPoolExecutoras_completed)ListDict)datetime)levelc                   @   sf   e Zd ZddedefddZdedefd	d
Zdede	e defddZ
de	e fddZdd ZdS )ParallelWorker         ?max_workersdelayc                 C   s(   || _ || _|| _|| _d | _d| _d S )NF)parserdbr   r   executorrunning)selfr   r   r   r    r   @/var/www/www-root/data/www/avtoreputaciya.ru/vk_parser/worker.py__init__   s   
zParallelWorker.__init__group_idreturnc              
   C   s  |dddd}z| j |}td| d|  | jj|ddd\}}|du r/d|d	< |W S |du rY| ||}||d
< t||d< |rV|d }| j ||d |d | |W S g }|D ]}	|	d |krg n|	|	 q]|r| ||}||d
< |r| j ||d d |d d | n	td| d t||d< W |S  t
y }
 ztd| d|
  t|
|d	< W Y d}
~
|S d}
~
ww )u*   Обработать одну группуr   N)r   	new_poststotal_postserroru%   🔍 Обработка группы u   , последний пост: 
   )offsetcountu/   Не удалось получить постыr   r   r   post_iddateu   📌 Группа u    : новых постов нетu1   ❌ Ошибка обработки группы : )r   get_last_post_idloggerinfor   get_group_wall_save_postslenupdate_group_trackingappend	Exceptionr   str)r   r   resultlast_post_idpostsnext_offsetsaved_count	last_postr   poster   r   r   process_group   sd   

zParallelWorker.process_groupr,   c                 C   s>   d}|D ]}| j ||r|d7 }qtd| d|  |S )u4   Сохранить список постов в БДr      u   💾 Сохранено u"    постов для группы )r   	save_postr!   r"   )r   r   r,   savedr0   r   r   r   r$   [   s   zParallelWorker._save_postsgroupsc                    s&  d_ g }tjd{  fdd|D }t|D ]d}|| }z7|jdd}|| |d r>td| d	|d   ntd
| d|d  d|d   t	
j W q ty~ } ztd| d	|  ||t|d W Y d}~qd}~ww W d   n1 sw   Y  d_ |S )uI   Запустить параллельную обработку группT)r   c                    s   i | ]
}  j||qS r   )submitr2   ).0r   r   r   r   r   
<dictcomp>l   s    z&ParallelWorker.run.<locals>.<dictcomp><   )timeoutr   u   ⚠️ Группа r   u   ✅ Группа u   : новых постов r   u   , всего r   uG   ❌ Ошибка при получении результата для )r   r   NF)r   r   r   r   r*   r'   r!   warningr"   timesleepr   r(   r   r)   )r   r6   resultsfuture_to_groupfuturer   r*   r1   r   r9   r   rune   s0   
$ zParallelWorker.runc                 C   s"   d| _ | jr| jjdd dS dS )u!   Остановить воркерF)waitN)r   r   shutdown)r   r   r   r   stop   s   zParallelWorker.stopN)r	   r
   )__name__
__module____qualname__intfloatr   r)   r   r2   r   r$   rC   rF   r   r   r   r   r      s    G
#r   )	threadingr>   loggingconcurrent.futuresr   r   typingr   r   r   basicConfigINFO	getLoggerrG   r!   r   r   r   r   r   <module>   s    
