2016-06-27 2 views
0

Вот странное заблуждение, с которым я столкнулся, когда пытаюсь использовать «asyncio» для планирования задачи «mongoimport». Как только я начал работать с mongod и вставлял команды, которые я сгенерировал на терминале, он работал. Однако, когда я пытаюсь использовать python3.4 asyncio, проблемы возникают:raise RuntimeError («Контур события закрыт») при попытке запланировать задачи «mongoimport»

File "/Users/wangyi/Documents/workspace/Math/machine_learning/ditech/io/collect.py", line 100, in <module> 
    parse_train_data() 
    File "/Users/wangyi/Documents/workspace/Math/machine_learning/ditech/io/collect.py", line 95, in parse_train_data 
    call_in_background(*targets) 
    File "/Users/wangyi/Documents/workspace/Math/machine_learning/ditech/io/collect.py", line 19, in wrapper 
    result = func(*args, **keywords) 
    File "/Users/wangyi/Documents/workspace/Math/machine_learning/ditech/io/collect.py", line 41, in call_in_background 
    loop.run_until_complete(asyncio.gather(*targets, loop=loop)) 
    File "/usr/local/lib/python3.4/asyncio/tasks.py", line 567, in gather 
    fut = async(arg, loop=loop) 
    File "/usr/local/lib/python3.4/asyncio/tasks.py", line 511, in async 
    task = loop.create_task(coro_or_future) 
    File "/usr/local/lib/python3.4/asyncio/base_events.py", line 211, in create_task 
    self._check_closed() 
    File "/usr/local/lib/python3.4/asyncio/base_events.py", line 265, in _check_closed 
    raise RuntimeError('Event loop is closed') 
RuntimeError: Event loop is closed 

Вот мой фрагмент кодов:

def parse_train_data(): 

    commandtpl = "mongoimport --host=127.0.0.1 -d DiDitech -c {table} -f {fields} --type tsv --file {target}" 

    for tb in tables: 
     tasks = list(map(lambda t: commandtpl.format(table=tb, fields=','.join(fields[tb]), target=t), train_dest[tb])) 
     print('commands of %s:' % tb) 
     print('' + '\n'.join(tasks)) 
     targets = [get_lines(ob) for ob in tasks] 
     call_in_background(*targets) 

call_in_background свет обертка с Timmer на run_util_complete части (asyncio.gather (* цели)). Цели определяются как coros, как указано в PEP.

def call_in_background(*targets): 
... 
    loop = get_loop() 
    print(loop.run_until_complete(asyncio.gather(*targets, loop=loop, return_exceptions=True))) 
    #loop.close() 

@asyncio.coroutine 
def get_lines(shell_command): 
    task = yield from asyncio.create_subprocess_shell(shell_command, 
      stdin=PIPE, stdout=PIPE, stderr=STDOUT) 

    return (yield from task.communicate())[0].splitlines() 
+0

Как выглядит 'call_in_background'? Закрывает ли он цикл? Пожалуйста, отредактируйте вопрос, чтобы включить [Минимальный, Полный и Подтверждаемый пример] (https://stackoverflow.com/help/mcve). – dirn

+0

@ dirn да он закроет цикл после выполнения run_until_complete. Должен ли я позвонить автору асинчио Анрю за помощью? –

+0

Это твоя проблема. Не закрывайте петлю, пока она не закончится. – dirn

ответ

0

Теперь я изменить коды

... 

    flag = False 
    if loop is None: 
     loop = get_loop() 
     flag = True 
    print(loop.run_until_complete(asyncio.gather(*targets, loop=loop, return_exceptions=True))) 

    if flag == False: 
     loop.close() 

и работает благодаря наконец перестраивая структуру кодов. Спасибо!!!

2016-06-28T16:39:59.128+0800 connected to: 127.0.0.1 
2016-06-28T16:39:59.136+0800 imported 279 documents 
2016-06-28T16:39:59.130+0800 connected to: 127.0.0.1 
2016-06-28T16:39:59.145+0800 imported 66 documents 
2016-06-28T16:39:59.134+0800 connected to: 127.0.0.1 
2016-06-28T16:39:59.142+0800 imported 288 documents 
2016-06-28T16:39:59.140+0800 connected to: 127.0.0.1 
2016-06-28T16:39:59.148+0800 imported 285 documents 

 Смежные вопросы

  • Нет связанных вопросов^_^