在Python中处理重复任务

在Python中处理重复任务,python,multithreading,Python,Multithreading,大家好,我是Python新手,我找不到任何方法来实现我的场景。如何启动具有不同参数的相同功能的多个重复任务,并且仍然能够停止某个任务 为了让事情更清楚,请查看下面的图片。我有一个f(x)函数。我想用不同的输入数据启动多个独立的重复呼叫,并在以后单独停止它们 更新:以下是整个场景。我有一个主函数,每60秒调用一次。此函数获取url列表,并根据某些条件决定使用给定url启动重复函数或停止已运行的函数 def f(x): #repeat every 5 secs until stopped

大家好,我是Python新手,我找不到任何方法来实现我的场景。如何启动具有不同参数的相同功能的多个重复任务,并且仍然能够停止某个任务

为了让事情更清楚,请查看下面的图片。我有一个f(x)函数。我想用不同的输入数据启动多个独立的重复呼叫,并在以后单独停止它们

更新:以下是整个场景。我有一个主函数,每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()

如果
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
在迭代中新建,您可以使用
队列

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
这是一些示例解决方案。

这是一个非常(太)宽泛的问题,没有给出任何具体的示例,有很多方法可以实现您想要的。但是,它可能值得一看并寻找一个高级解决方案。

您可以使用gevent.spawn()来实现您的独立任务。一段


你能澄清一下“多个重复性任务”吗?你的意思是你想调用
f(a)
f(b)
f(c)
每次调用一次,并让它们重复运行直到取消,还是你只是想调用
f(a)
f(b)
f(c)
并且以后能够停止其中任何一个吗?要并行运行,可以使用多处理或多线程。对于重复性任务,您需要循环(如while循环)以便能够取消它们,您需要在main上运行一个循环,该循环将检查用户停止命令,该命令将通知函数上运行的循环退出。这是三个截然不同的问题。请为每一个问题提出一个新问题,定义您的尝试和目标,包括尽可能多的信息/数据。@sberry每f(x)一次呼叫,然后让他们回忆自己,直到停止。在某个时间点可以运行多个(甚至没有)任务。这3个只是一个例子。
>>>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']