Невозможно создать пул, когда я использую Pool.apply_async () многопроцессорной Python - PullRequest
0 голосов
/ 31 октября 2019

Python версия 3.5.6

# main.py #
import os
import sys
import subprocess
from datetime import datetime
import multiprocessing as mp

from util import _gzsl_arg_template, _zsl_arg_template

os.environ['CUDA_VISIBLE_DEVICES'] = '2'

# Experimental Setting
EXP_SET = '/zsl'
MODEL = '/argan'
EXP = '/e3_difD'
MODEL_PATH = './model' + MODEL
EXP_PATH = './exp' + EXP_SET + MODEL + EXP

DATASETS = ['/CUB', '/FLO']

# Arguments to Test
TEST_ARG = '--d_hl'
TEST_VALUE = [1,2,3]

for dataset in DATASETS:
    if EXP_SET == '/gzsl':
        arg_template = _gzsl_arg_template.get(dataset)
    else:
        arg_template = _zsl_arg_template.get(dataset)

    pool = mp.Pool(processes=len(TEST_VALUE))
    for value in TEST_VALUE:
        arg_template[TEST_ARG] = value

        arg_list = []
        for (key,data) in arg_template.items():
            arg_list.append(key)
            arg_list.append(str(data))
        arg_list.insert(0, MODEL_PATH+EXP+'.py')
        arg_list.insert(0, 'python3')

        result_file = EXP_PATH + dataset + '/value_' + str(value) + '.txt'
        with open(result_file, 'w') as r_file:
            print('\n##########################################', file=r_file) 
            print('Exp Info: \n\t type: {0}\n\t model: {1}\n\t exp: {2}\n\t time: {3}'.format('generalized zero-shot', MODEL, EXP, datetime.now().strftime('%Y-%m-%d %H:%M:%S')), file=r_file)
            print('##########################################', file=r_file)
            pool.apply_async(func=subprocess.run, kwds=dict(args=arg_list, stdout=r_file))
    pool.close()
    pool.join()

Выше мой файл Python для запуска. Проблема в том, что когда я запускаю код с python main.py, процесс не добавляется в пул.

Полагаю, с аргументами должна быть какая-то проблема. Итак, я проверил спецификацию вызовов на официальном документе Python, но ошибки нет. И когда я просто использую subprocess.run(arg_list, stdout=r_file), код корректен для запуска.

Я просто делаю следующее:

def err(e):
    print(e)

и заменяю

apply_async(func=subprocess.run, kwds=dict(args=arg_list, stdout=r_file))

на:

apply_async(func=subprocess.run, kwds=dict(args=arg_list, stdout=r_file), error_callback=err)

Вывод:

cannot serialize '_io.TextIOWrapper' object

Не могу понять, что не так с звонящим. Помощь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...