Python: запускать одну функцию до завершения другой - PullRequest
10 голосов
/ 15 марта 2011

У меня есть две функции, draw_ascii_spinner и findCluster(companyid).

. Я хотел бы:

  1. Выполнить findCluster(companyid) в фоновом режиме и во время его обработки ....
  2. Запускать draw_ascii_spinner до тех пор, пока не закончится findCluster(companyid)

Как мне начать пытаться решить эту проблему (Python 2.7)?

Ответы [ 6 ]

11 голосов
/ 15 марта 2011

Использовать темы:

import threading, time

def wrapper(func, args, res):
    res.append(func(*args))

res = []
t = threading.Thread(target=wrapper, args=(findcluster, (companyid,), res))
t.start()
while t.is_alive():
    # print next iteration of ASCII spinner
    t.join(0.2)
print res[0]
7 голосов
/ 15 марта 2011

Вы можете использовать многопроцессорность . Или, если findCluster(companyid) имеет разумные точки остановки, вы можете превратить его в генератор вместе с draw_ascii_spinner, чтобы сделать что-то вроде этого:

for tick in findCluster(companyid):
    ascii_spinner.next()
2 голосов
/ 15 марта 2011

Как правило, вы будете использовать темы.Вот упрощенный подход, который предполагает, что есть только два потока: 1) основной поток, выполняющий task, 2) поток вращения:

#!/usr/bin/env python

import time
import thread

def spinner():
    while True:
        print '.'
        time.sleep(1)

def task():
    time.sleep(5)

if __name__ == '__main__':
    thread.start_new_thread(spinner, ())
    # as soon as task finishes (and so the program)
    # spinner will be gone as well
    task()
1 голос
/ 15 марта 2011

Вы захотите провести исследование потоков, общая форма будет такой:

  • Создайте новый поток для findCluster и создайте некоторый способ, чтобы программа знала, что метод работает - самый простой в Python - это просто глобальное логическое значение
  • Запустите draw_ascii_spinner в цикле while, при условии, что он все еще работает, возможно, вы захотите, чтобы этот поток спал в течение короткого периода времени между итерациями

Вот краткое руководство по Python - http://linuxgazette.net/107/pai.html

1 голос
/ 15 марта 2011

Это может быть сделано с потоками. FindCluster запускается в отдельном потоке, и когда это сделано, он может просто сигнализировать другому потоку, который запрашивает ответ.

0 голосов
/ 15 марта 2011

Выполнить findCluster() в потоке (модуль Threading делает это очень легко), а затем draw_ascii_spinner, пока не будет выполнено какое-либо условие.

Вместо использования sleep() для установки темпа вращения, вы можете ждать в потоке wait() с таймаутом.

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