starmap_async обходит функцию печати - PullRequest
1 голос
/ 08 мая 2019

Итак, вот код, который я запускаю:

from itertools import product
from functools import partial

import numpy as np
import pandas as pd
import multiprocessing as mp

def func1(n0_tup, n1_tup, n3, df):
    df = df.copy()
    df = df.astype(object)

    X = pd.DataFrame({'col0': np.repeat(-n0_tup[1],n1_tup[0]),
                      'col1': n3*np.arange(n1_tup[0]),
                       'col2': n3*np.repeat(n1_tup[1],n1_tup[0]),
                       'col3': [f'random string {i}' for i in range(n1_tup[0])]})

    X['col4'] = func2(n1_tup[0], X.shape[0])
    temp = (n0_tup[1],n1_tup[0],n1_tup[1],n3)
    ind = (n0_tup[0],n1_tup[0],n1_tup[1])

    df[f'special col {temp}'] = n0_tup[1]+n1_tup[0]+n1_tup[1]+n3

    df2 = df
    df2[f'special col2 {temp}'] = n0_tup[1]+n1_tup[0]+n1_tup[1]+n3

    df3 =df2
    df3[f'special col3 {temp}'] = n0_tup[1]+n1_tup[0]+n1_tup[1]+n3

    print(temp)#<----This line gets skipped over by starmap_async

    return ind, temp, X['col2'].sum()+ df3[f'special col3 {temp}'].sum()

def main3():
    xd = pd.DataFrame({'col1': list('just a string')})
    A_lst = np.arange(1,10+1)
    A_size = A_lst[-1]+1
    B_rge = np.arange(660,670)
    B_size = len(B_rge)

    lst1 = (item for item in product(A_lst, repeat = 2) if item[0] < item[1])
    lst2 = enumerate(np.arange(660,670))
    arg_list = product(lst2, lst1)

    with mp.Pool(processes = mp.cpu_count()) as pool:
        result = pool.starmap_async(partial(func1, n3 = 100, df = xd), arg_list).get()

    result_fin = np.zeros([B_size, A_size - 1, A_size])
    for item in result:
        ind = item[0]
        result_fin[ind[0], ind[1], ind[2]] =item[2]

    return result, result_fin

if __name__ == '__main__':
    result_main3 = main3()

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

1) Почему пропускается функция печати и как я могу ее включить?

2) Существует ли простой способ отслеживать, выполняются ли коды асинхроннокроме функции печати?

3) Предположим, что изменение func1 не разрешено, возможно ли еще больше ускорить код?Если так, то как?

Заранее спасибо, ребята

РЕДАКТИРОВАТЬ: удалены некоторые неиспользованные импорт

...