o
    5c                     @   s   d Z ddlmZ ddlmZ ddlmZ ddlZddl	Z	ddl
Zddl
mZ ddlmZ e	jdZdd	 Ze	jjd
d Zdd Ze	jjdd ZdS )zd
Tests multithreading behaviour for reading and
parsing files for each parser defined in parsers.py
    )	ExitStack)BytesIO)
ThreadPoolN)	DataFramepyarrow_skipc                 C   s\   t tj| dtdd}d|d< d|d< d|d< tjd| dd	|d
< tj| dd|d< |S )z
    Construct a DataFrame for testing.

    Parameters
    ----------
    num_rows : int
        The number of rows for our DataFrame.

    Returns
    -------
    df : DataFrame
       abcde)columnsfoobarbazz20000101 09:00:00s)periodsfreqdateint64)dtypeint)r   nprandomrandlistpd
date_rangearange)num_rowsdf r   ^/var/www/html/gps/gps/lib/python3.10/site-packages/pandas/tests/io/parser/test_multi_thread.py_construct_dataframe   s   r   c           	         s   | }d d} fddt |D }t /fdd|D }td}||j|}|d }|D ]}t|| q2W d    d S 1 sFw   Y  d S )Ni'  d   c                    s(   g | ]}d  dd t D  qS )
c                 S   s&   g | ]}|d d|d d|d qS )d,r   .0ir   r   r   
<listcomp>3   s   & zCtest_multi_thread_string_io_read_csv.<locals>.<listcomp>.<listcomp>)joinrangeencode)r%   _)max_row_ranger   r   r'   2   s    z8test_multi_thread_string_io_read_csv.<locals>.<listcomp>c                    s   g | ]	}  t|qS r   )enter_contextr   )r%   b)stackr   r   r'   9   s       r   )r)   r   r-   r   mapread_csvtmassert_frame_equal)	all_parsersparser	num_filesbytes_to_dffilespoolresultsfirst_resultresultr   )r,   r/   r   $test_multi_thread_string_io_read_csv+   s   
"r>   c                    s   fdd} fddt D }td}|||}W d   n1 s)w   Y  |d j}|dd D ]}	||	_q9t|}
|
S )	a  
    Generate a DataFrame via multi-thread.

    Parameters
    ----------
    parser : BaseParser
        The parser object to use for reading the data.
    path : str
        The location of the CSV file to read.
    num_rows : int
        The number of rows to read per task.
    num_tasks : int
        The number of tasks to use for reading this DataFrame.

    Returns
    -------
    df : DataFrame
    c                    sB   | \}}|s j dd|dgdS  j ddt|d |dgdS )aj  
        Create a reader for part of the CSV.

        Parameters
        ----------
        arg : tuple
            A tuple of the following:

            * start : int
                The starting row to start for parsing CSV
            * nrows : int
                The number of rows to read.

        Returns
        -------
        df : DataFrame
        r   r   )	index_colheadernrowsparse_datesN   	   )r?   r@   skiprowsrA   rB   )r2   r   )argstartrA   )r6   pathr   r   readerX   s   
z0_generate_multi_thread_dataframe.<locals>.readerc                    s    g | ]} |    fqS r   r   r$   )r   	num_tasksr   r   r'   z   s    z4_generate_multi_thread_dataframe.<locals>.<listcomp>)	processesNr   rC   )r)   r   r1   r	   r   concat)r6   rH   r   rJ   rI   tasksr:   r;   r@   rfinal_dataframer   )r   rJ   r6   rH   r    _generate_multi_thread_dataframeD   s   "

rP   c                 C   sl   d}d}| }d}t |}t|}|| t||||}t|| W d    d S 1 s/w   Y  d S )N   i z__thread_pool_reader__.csv)r   r3   ensure_cleanto_csvrP   r4   )r5   rJ   r   r6   	file_namer   rH   rO   r   r   r   )test_multi_thread_path_multipart_read_csv   s   
"rU   )__doc__
contextlibr   ior   multiprocessing.poolr   numpyr   pytestpandasr   r   pandas._testing_testingr3   markusefixtures
pytestmarkr   slowr>   rP   rU   r   r   r   r   <module>   s     
F