【问题标题】:Multiprocessing with Queue(): TypeError: can't pickle _thread.lock objects使用 Queue() 进行多处理:TypeError: can't pickle _thread.lock objects
【发布时间】:2020-06-06 07:09:21
【问题描述】:

这是我的代码:

def search(page, sort, start, end, q):
    print(mp.current_process())
    results = req.request_buff_market_page(page, sort, start, end)

    for i in results:
        if(i[1] >= 20 and 'Souvenir' not in i[0]):
            q.put(i)


if __name__ == '__main__':
    page = 1
    q = queue.Queue()
    with mp.Pool(processes=mp.cpu_count()) as pool:
        print(page)
        pool.starmap(search, (page, 'asc', 200, 205, q))
        page += 1

    while not(q.empty()):
        print(q.get())

输出:

 Traceback (most recent call last):
      File "C:\Users\Andrew\Desktop\ultralight\mp_buff.py", line 33, in <module>
        pool.starmap(search, (page, 'asc', 200, 205, q))
    .........
    TypeError: can't pickle _thread.lock objects

我不确定是什么导致了这个错误。错误发生在这一行:

pool.starmap(search, (page, 'asc', 200, 205, q))

编辑:将我的代码更改为使用 multiprocessing.Process()

 for i in range(mp.cpu_count()):
     workers.append(mp.Process(target=search, args=(page, 'asc', 200, 230, q_search)))
     page += 1
 for i in workers: i.start()
 for i in workers: i.join()

【问题讨论】:

  • 您不能将queue.Queuemultiprocessing 一起使用。请改用multiprocessing.Queue
  • @dano 谢谢,我在发布这个问题后意识到这一点。

标签: python multiprocessing python-multiprocessing


【解决方案1】:

您将多处理池视为多线程池,这不是一回事。查看multiprocessing.pool.ThreadPool

【讨论】:

  • 我将代码更改为使用 workers.append(mp.Process(target=search, args=(page, 'asc', 200, 205, q))) 而不是池,并且它有效。那么您知道使用multiprocessing.pool.ThreadPool 还是Process() 更好吗?
  • 更好的选择取决于你在你的工作函数中做什么。如果您正在执行不释放 GIL 的 CPU 密集型工作,则使用线程不会提高性能;您必须使用子流程。
  • @Andrew 虽然将Queue 直接传递给mp.Process 可能不会引发错误,但队列实际上在进程之间是不可用的,您必须为此使用mp.Queue
猜你喜欢
  • 2018-07-20
  • 2018-06-26
  • 2018-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多