为什么 APScheduler class 没有序列化?

Why isn't the APScheduler class serialized?

我正在尝试使用共享内存创建一个单例,以确保 class 对象在所有进程之间都是相同的,但为此我需要对其进行序列化:

class Singleton(type):

    filename = path.basename(path.abspath(__file__)).split('.')[0]

    def __call__(cls, *args, **kwargs):
        instance = super(Singleton, cls).__call__(*args, **kwargs)
        pickled = pickle.dumps(instance)


class SingleScheduler(APScheduler, metaclass=Singleton):

    def __init__(self, *args, **kwargs):
        super().__init__(args, kwargs)
TypeError: Schedulers cannot be serialized. Ensure that you are not passing a scheduler instance as an argument to a job, or scheduling an instance method where the instance contains a scheduler as an attribute.

有什么方法可以序列化吗?

P.S。是的,我知道我可以拿一个 redis 并将参数和状态传递给它,但我想尝试在没有任何依赖的情况下做到这一点...

调度程序已明确设置为不可序列化,因为它无论如何都不会序列化,因为它包含同步原语和对作业存储的引用。许多人因此 运行 陷入 pickling 错误,因此 3.7.0 版本添加了这条明确的错误消息。

通过足够的努力,所有这些 都可以 解决,但内存作业存储除外。如果您打算创建共享单个外部存储的调度程序的多个副本,那将不会在 APScheduler 3.x 上工作,因为它不是为分布式使用而设计的。 4.0 版本将纠正这个问题,这是那里最突出的功能。另一方面,如果您使用的是内存支持的作业存储,那么序列化只会创建作业的多个副本,此时您最好还是为每个进程创建一个新的调度程序。

如果你想在多个进程之间共享一个调度器,在 APScheduler 3.x 上实现的方法是让调度器 运行 在一个专用进程中,然后通过任一进程与所述进程通信RPyC,一些网络服务器或类似的IPC或网络机制。

FAQ entry on scheduler sharing

Example on how to use RPyC to provide a shared scheduler