【问题标题】:processing data in parallel python并行处理数据python
【发布时间】:2019-05-10 08:19:15
【问题描述】:

我有一个脚本,其中的一部分有时可以并行运行。 Python 3.6.6

目标是最大程度地减少执行时间。

其中一个部分是连接到 Redis,获取两个键的数据,pickle.loads 用于每个键并返回已处理的对象。

此类任务的最佳解决方案是什么? 我已经尝试过Queue(),但是Queue.get_nowait() 锁定了脚本,并且在{process}.join() 之后,即使任务完成,它也会停止执行。使用pool.map 会引发TypeError: can't pickle _thread.lock objects

我所能实现的只是所有部分的并行运行,但仍然无法连接结果

【问题讨论】:

    标签: python-3.x python-multiprocessing python-multithreading


    【解决方案1】:

    cPickle.load() 将释放 GIL,以便您可以轻松地在多个线程中使用它。但是cPickle.loads() 不会,所以不要使用它。

    基本上,将 Redis 中的数据放入 StringIO,然后从那里放入 cPickle.load()。使用concurrent.futures.ThreadPoolExecutor 在多个线程中执行此操作。

    【讨论】:

    • 你说cPickle.load()会发布GIL,也说cPickle.load()不会。
    • 所以建议在这种情况下选择pool.map
    • @AuroraWang:抱歉,已修复,错过了s
    • @Chickenfresh:您可以使用任何 ThreadPoolExecutor 方法,map 将是一个不错的选择。
    • 我在 python3 中知道_pickle 代表您对cPickle 的解释,如果我将Redis 中的一个对象放入io.StringIO 它会引发TypeError: initial_value must be str or None, not bytes
    猜你喜欢
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 2014-01-27
    • 1970-01-01
    • 1970-01-01
    • 2013-10-26
    • 2011-01-04
    相关资源
    最近更新 更多