在两个进程之间共享资源

2024-10-01 11:31:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我想知道Python中两个进程之间共享队列(资源)的最佳实践。以下是每个流程的操作:

进程1:连续从流式api获取数据(json格式)

进程2:是一个守护进程(类似于sandermarechal的code),它将数据(一次一个)提交到数据库中

因此,进程1将一个数据单元放入这个共享资源中,进程2将轮询这个共享资源中的任何新数据单元,并将它们存储在数据库中(如果有的话)。在

我想到了一些选择:

  • 使用酸洗(缺点:酸洗和脱酸的额外开销)
  • 通过进程1的stdout传递数据 到进程2的stdin(缺点:没有,但不确定如何用守护程序实现)
  • 使用multiprocessing库中的pool对象(缺点:不确定如何将其编码为一个进程是守护进程)

我想要一个最佳的解决方案,在这方面,与一些代码:)。谢谢。在


Tags: 数据api数据库json队列进程格式code
1条回答
网友
1楼 · 发布于 2024-10-01 11:31:54

在本例中,multiprocessing.pool不是您想要的,它对于在后台(同时)完成多个工作单元非常有用,而对于管理共享资源来说就不那么有用了。由于您似乎已经确定了通信的格式,而且它们只在一个方向上通信,所以您需要的是multiprocessing.Queuedocumentation有一个很好的例子来说明如何使用它-您需要让您的进程1根据需要将数据放入队列中,并且进程2在无限循环中调用q.get()。这将导致使用者在无事可做时阻塞,而不是像您建议的那样忙着等待(这可能会浪费处理器周期)。这留下的问题是关闭守护进程-可能最好的方法是让生产者在队列的末尾放置一个sentinel值,以确保使用者处理所有请求。其他替代方法包括尝试在子进程退出时强行终止进程,但这很容易出错。在

注意,这假设生产者产生消费者(反之亦然),如果消费者是一个长期运行的守护进程,可以处理多个相对短暂的生产者,情况会变得相当困难-据我所知,没有任何跨平台的高级IPC模块;最可移植(通常也是最容易)的方式处理这可能是使用文件系统作为一个队列-在某处有一个假脱机文件夹,生产者可以为每个请求写入一个文本文件;然后消费者可以随意处理这些文件-但是,这并非没有它自己的问题:您需要确保使用者不会试图打开半写的指令文件,生产商没有相互干涉,生产商和消费者就请求的顺序达成一致。在

相关问题 更多 >