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