我有以下使用调度程序和多处理模块的代码:
def computation(): def function1(q): while True: daydate = datetime.now() number = random.randrange(1, 215) print('Sent to function2: ({}, {})'.format(daydate, number)) q.put((daydate, number)) time.sleep(2) def function2(q): while True: date, number = q.get() print("Recevied values from function1: ({}, {})".format(date, number)) time.sleep(2) if __name__ == "__main__": q = Queue() a = Process(target=function1, args=(q,)) a.start() b = Process(target=function2, args=(q,)) b.start() a.join() b.join() schedule.every().monday.at("08:45").do(computation) schedule.every().tuesday.at("08:45").do(computation) while True: schedule.run_pending() time.sleep(1)
但是,在执行代码时会出现以下错误:
AttributeError:无法腌制本地对象的计算。
和:
OSError:[WinError 87]参数不正确
如何解决这个问题?我已经尝试通过在文档中声明的模块顶层定义函数来解决此问题(https://docs.python.org/2/library/pickle.html#what-can- be-pickled-和未腌制),但仍会给出相同的错误。
嵌套函数不是在顶级定义的函数,因此这就是您收到错误的原因。您需要重新定位计算的定义function1以及function2计算之外。
function1
function2
编写方式时,您的流程将立即启动,而不是在安排它们运行的日期开始。那可能会达到您的预期目的:
import os import time import random from multiprocessing import Process, Queue from threading import Thread from datetime import datetime import schedule def function1(q): while True: daydate = datetime.now() number = random.randrange(1, 215) fmt = '(pid: {}) Sent to function2: ({}, {})' print(fmt.format(os.getpid(), daydate, number)) q.put((daydate, number)) time.sleep(2) def function2(q): while True: date, number = q.get() fmt = "(pid: {}) Received values from function1: ({}, {})" print(fmt.format(os.getpid(), date, number)) # time.sleep(2) no need to sleep here because q.get will block until # new items are available def computation(): q = Queue() a = Process(target=function1, args=(q,)) a.start() b = Process(target=function2, args=(q,)) b.start() a.join() b.join() if __name__ == "__main__": # We are spawning new threads as a launching platform for # computation. Without it, the next job couldn't start before the last # one has finished. If your jobs always end before the next one should # start, you don't need this construct and you can just pass # ...do(computation) schedule.every().friday.at("01:02").do( Thread(target=computation).start ) schedule.every().friday.at("01:03").do( Thread(target=computation).start ) while True: schedule.run_pending() time.sleep(1)
就像现在一样,一旦启动,您的进程将永远运行。如果这不是您想要的,则必须考虑实现一些停止条件。