2013-12-05 3 views
0

Привет, ребята, я новичок в Python, и я не могу найти никаких подходов к моему сценарию. Как я могу запускать несколько повторяющихся задач одной и той же функции с разными параметрами и по-прежнему иметь возможность остановить определенный?Обработка повторяющихся задач в Python

Чтобы сделать чётное изображение, проверьте изображение ниже. У меня есть функция f (x). Я хочу запустить несколько независимых повторяющихся вызовов с разными входными данными, а позже их также остановить отдельно.

description http://happyfacedevs.com/public/python.png

UPDATE: Вот весь сценарий. У меня есть основная функция, которая вызывается каждые 60 секунд. Эта функция получает список URL-адресов и на основе некоторых условий решает запустить повторяющуюся функцию с заданным URL-адресом или останавливает уже запущенный.

def f(x): 
    #repeat every 5 secs until stopped 
    #do stuff with x 


def mainTask(): 
    #gets a new list of urls 

    #for every url, start a new repeating task or stop an existing one 
    #based on some conditions 

    threading.Timer(60, mainTask).start() 


mainTask() 
+0

Можете ли вы пояснить «несколько повторяющихся задач?» Вы имеете в виду, что вы хотите называть 'f (a)', 'f (b)', 'f (c)' once each и периодически запускать их до отмены, или просто означает, что вы хотите называть 'f (a) ',' f (b) ',' f (c) 'и быть в состоянии остановить любой из них в более позднее время? – sberry

+0

Чтобы выполнить параллельные операции, вы можете использовать Multiprocessing или Multithreading. Для повторяющихся задач вам нужно выполнить цикл (например, цикл while), чтобы иметь возможность их отменить, вам нужен цикл, выполняющийся на главном, который будет проверять команду остановки пользователя, которая будет уведомлять циклы, выполняющиеся над функциями для выхода. Это три разных вопроса. Пожалуйста, задайте новый вопрос для каждого, определив, что вы пробовали, и каковы ваши цели, укажите как можно больше информации/данных. –

+0

@sberry называть каждый f (x) один раз, а затем заставить их напомнить себя до остановки. В определенный момент времени может выполняться несколько (или даже нет) задач. Эти 3 были всего лишь примером. – sheitan

ответ

0

Если a,b,c постоянен все время:

import time 
import threading 

def f(param, stop_event): 
    while not stop_event.is_set(): 
     # do something with param 


events = {'a': threading.Event(), 
      'b': threading.Event(), 
      'c': threading.Event(), 
} 
for param, ev in zip([a, b, c], events): 
    t = Thread(target=f, args=(param, ev)) 
    t.start() 
time.sleep(10) 
events['a'].set() # stop a 
time.sleep(10) 
events['b'].set() # stop b 
time.sleep(10) 
events['c'].set() # stop c 

Если a,b,c нового в итерации можно использовать Queue:

import time 
import threading 

def f(q, stop_event): 
    while not stop_event.is_set(): 
     param = q.get() 
     # do something with param 

q = threading.Queue() 
events = {'a': threading.Event(), 
      'b': threading.Event(), 
      'c': threading.Event(), 
} 
for ev in events: 
    t = Thread(target=f, args=(q, ev)) 
    t.start() 
q.put(a) 
q.put(b) 
q.put(c) 
time.sleep(10) 
events['a'].set() # stop a 
time.sleep(10) 
events['b'].set() # stop b 
time.sleep(10) 
events['c'].set() # stop c 

Это несколько примеров решения.

0

Это очень широкий вопрос, не показывающий каких-либо конкретных примеров, и есть много способов добиться того, чего вы хотите. Тем не менее, стоит рассмотреть PEP 3156 и tulip для решения высокого уровня.

2

Вы можете использовать gevent.spawn() для реализации своих независимых задач. фрагмент от http://www.gevent.org/intro.html#example

>>>import gevent 
>>>from gevent import socket 
>>>urls = ['www.google.com', 'www.example.com', 'www.python.org'] 
>>>jobs = [gevent.spawn(socket.gethostbyname, url) for url in urls] 
>>>gevent.joinall(jobs, timeout=2) 
>>>[job.value for job in jobs] 
['74.125.79.106', '208.77.188.166', '82.94.164.162'] 
Смежные вопросы