调度库如何在并行执行中传递arg

  • 本文关键字:arg 并行执行 调度 python
  • 更新时间 :
  • 英文 :


我正在用Python尝试调度库,他们有一些关于如何传递参数的示例,如下greet函数中所示:

import schedule
def greet(name):
print('Hello', name)
schedule.every(2).seconds.do(greet, name='Alice')
schedule.every(4).seconds.do(greet, name='Bob')
from schedule import every, repeat
@repeat(every().second, "World")
@repeat(every().day, "Mars")
def hello(planet):
print("Hello", planet)

这是repo中关于如何在包含线程的并行执行中运行使用调度的示例:

import threading
import time
import schedule
def job():
print("I'm running on thread %s" % threading.current_thread())
def run_threaded(job_func):
job_thread = threading.Thread(target=job_func)
job_thread.start()
schedule.every(10).seconds.do(run_threaded, job)
schedule.every(10).seconds.do(run_threaded, job)
schedule.every(10).seconds.do(run_threaded, job)
schedule.every(10).seconds.do(run_threaded, job)
schedule.every(10).seconds.do(run_threaded, job)

while 1:
schedule.run_pending()
time.sleep(1)

如何使用并行执行和传递参数来结合这两个概念?下面的代码不是来自回购,但我只是在试验:

import threading
import time
import schedule
from schedule import every, repeat
def job(name):
print("I'm running on thread %s" % threading.current_thread())
print('Hello', name)
def run_threaded(job_func):
job_thread = threading.Thread(target=job_func)
job_thread.start()
schedule.every(10).seconds.do(run_threaded, name='Alice')
schedule.every(10).seconds.do(run_threaded, name='Sam')
schedule.every(10).seconds.do(run_threaded, name='Bob')
schedule.every(10).seconds.do(run_threaded, name='Steve')
schedule.every(10).seconds.do(run_threaded, name='Lester')

while 1:
schedule.run_pending()
time.sleep(1)

这将出错:

Traceback (most recent call last):
File "C:UsersbbartlingOneDrive - SlipstreamDesktopLBSopenCvTestingSO_schedules.py", line 24, in <module>
schedule.run_pending()
File "C:Python39libsite-packagesschedule__init__.py", line 780, in run_pending
default_scheduler.run_pending()
File "C:Python39libsite-packagesschedule__init__.py", line 100, in run_pending
self._run_job(job)
File "C:Python39libsite-packagesschedule__init__.py", line 172, in _run_job
ret = job.run()
File "C:Python39libsite-packagesschedule__init__.py", line 661, in run
ret = self.job_func()
TypeError: run_threaded() got an unexpected keyword argument 'name'

您可以将参数传递给一个类,并为每个线程创建该类的实例。

import threading
import time
import schedule

class greeting():
def __init__(self, name):
self.name = name

def hello(self):
print("I'm running on thread %s" % threading.current_thread())
print('Hello', self.name)

def run_threaded(name):
instance = greeting(name)
job_thread = threading.Thread(target=instance.hello)
job_thread.start()

schedule.every(10).seconds.do(run_threaded, name='Alice')
schedule.every(10).seconds.do(run_threaded, name='Sam')
schedule.every(10).seconds.do(run_threaded, name='Bob')
schedule.every(10).seconds.do(run_threaded, name='Steve')
schedule.every(10).seconds.do(run_threaded, name='Lester')

while 1:
schedule.run_pending()
time.sleep(1)

threading.Thread接受一个参数args,该参数将参数传递给函数。

import threading
import time
import schedule
from schedule import every, repeat
def job(name):
print("I'm running on thread %s" % threading.current_thread())
print('Hello', name)
def run_threaded(job_func, name):
job_thread = threading.Thread(target=job_func, args=(name,))
job_thread.start()
schedule.every(10).seconds.do(run_threaded, name='Alice')
schedule.every(10).seconds.do(run_threaded, name='Sam')
schedule.every(10).seconds.do(run_threaded, name='Bob')
schedule.every(10).seconds.do(run_threaded, name='Steve')
schedule.every(10).seconds.do(run_threaded, name='Lester')

while 1:
schedule.run_pending()
time.sleep(1)

最新更新