Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 1个生产者,1个消费者,只有1条数据需要通信,队列是一种过度使用吗?_Python_Python 3.x_Pandas_Multiprocessing_Interprocess - Fatal编程技术网

Python 1个生产者,1个消费者,只有1条数据需要通信,队列是一种过度使用吗?

Python 1个生产者,1个消费者,只有1条数据需要通信,队列是一种过度使用吗?,python,python-3.x,pandas,multiprocessing,interprocess,Python,Python 3.x,Pandas,Multiprocessing,Interprocess,这个问题与Python多处理相关。我要求为我的特定场景提供合适的进程间通信数据结构: 我的情景 我有一个生产者和一个消费者 生产者每10 ish秒生成一个相当小的panda数据帧,然后生产者将其放在python.multiprocess.queue上 使用者是一个GUI轮询,每100ms轮询一次python.multiprocess.queue。消费者捕获生产者生成的每一个数据帧是非常关键的 我的想法 python.multiprocess.queue就是为了达到这个目的(我想),而且使用起来非

这个问题与Python多处理相关。我要求为我的特定场景提供合适的进程间通信数据结构:

我的情景 我有一个生产者和一个消费者

  • 生产者每10 ish秒生成一个相当小的panda数据帧,然后生产者将其放在
    python.multiprocess.queue
  • 使用者是一个GUI轮询,每100ms轮询一次python.multiprocess.queue。消费者捕获生产者生成的每一个数据帧是非常关键的
  • 我的想法
    python.multiprocess.queue
    就是为了达到这个目的(我想),而且使用起来非常简单!(赞美绿色滑梯主!)。但是我显然没有充分利用队列的潜力,因为队列中只有一个生产者、一个消费者和最多一个项目。这让我相信有比排队更简单的事情。我试图搜索它,但我被下列选项弄得不知所措:
    python3.5文档:18。进程间通信和联网
    。我还怀疑有一种方法根本不涉及进程间通信数据结构,以满足我的需要

    请注意

  • 表现不是很重要
  • 我现在将坚持使用多处理,而不是多线程
  • 我的问题 我应该满足于排队吗?还是有更推荐的方法?我不是一个专业的程序员,所以我坚持用久经考验的方式做事。 我也欢迎任何关于解决我的问题的替代方法的建议


    谢谢我,你提到的最重要的事情是:

    消费者捕获生产者生成的每一个数据帧是非常关键的

    因此,假设您使用了一个变量来存储数据帧。生产者将其设置为生产价值,消费者只需阅读即可。我想那会很好用的

    但是,如果消费者不知何故被不止一个生产周期所阻碍,会发生什么呢?然后在读取之前会覆盖一些旧值。这就是为什么我认为(线程安全的)队列几乎是“按定义”的方式


    此外,要小心过早的优化。如果对你的情况有效,那就太好了。如果有一天,在另一种情况下,性能出现问题,那么您只需要花费额外的工作,IMO.

    “python.multiprocess.queue很好地实现了这一目的,而且使用起来非常简单!”——“性能不是很重要”。看起来你已经对它很满意了,所以有比排队更好的方法吗?我也很喜欢走路,直到我知道你会跑,甚至会飞。这类问题可能会得到更好的回答。@Kateract在提到其他网站时,指出concurrent.futures.ThreadPoolExecutor和ProcessPoolExecutor
    a(线程安全)队列几乎是“按定义”的方式通常是很有帮助的.
    嗯,我的答案与多线程有关,但你说你在使用多线程处理,所以我想这与额外的进程有关。而且,关于分区,据我所知,在同一进程中运行的线程之间划分工作比拥有多个进程、彼此通信、查看进程间通信更为轻量级。关于“谁负责”,答案是:无论模块实现者选择何种方式封装在
    python.multiprocess.queue
    类中,我想您都可以查看源代码。关于最后一条评论,请注意
    multiprocess.queue
    是一个专用队列,而不是常规队列,虽然它们实现了相同的行为(但实现方式不同)。