python中的多处理不同功能

时间:2020-07-02 03:01:17

标签: python multiprocessing

我在python中有两个不同的函数,它们都有完全独立的输入和输出值。但是它们需要很长时间才能执行,因此最好将它们并行化。我如何几乎同时执行它们?他们应该有自己的输入和输出参数。 multiprocessing包有可能吗?

我只能找到示例,它们在同一队列中工作。

编辑: 我现在尝试使用threading

q = queue.Queue()
threads_list = list()
t = Thread(target=lambda fill_list, arg1: q.put(fill_list(arg1)), args=(q, list, x, y, z, xx, yy, size, stringg))
t.start()
threads_list.append(t)
for t in threads_list:
    t.join()
result = q.get()

但是我得到了错误:

Exception in thread Thread-1:
Traceback (most recent call last):
  File "/usr/lib/python3.6/threading.py", line 916, in _bootstrap_inner
self.run()
  File "/usr/lib/python3.6/threading.py", line 864, in run
self._target(*self._args, **self._kwargs)
TypeError: <lambda>() takes 2 positional arguments but 9 were given

^CTraceback (most recent call last):
  File "main.py", line 120, in <module>
result = q.get()
  File "/usr/lib/python3.6/queue.py", line 164, in get
self.not_empty.wait()
  File "/usr/lib/python3.6/threading.py", line 295, in wait
waiter.acquire()

编辑:threads_list中只有一个线程。

谢谢

1 个答案:

答案 0 :(得分:0)

这是使用multiprocessing模块的简单示例,该模块提供基于进程的(而不是基于线程的)并行性:

from multiprocessing import Process, Manager
from time import sleep


def sum1(n, ret_dict):
    sleep(1.0)
    ret_dict['sum1'] = n + 1


def sum2(n, ret_dict):
    sleep(1.0)
    ret_dict['sum2'] = n + 2


def main():
    manager = Manager()
    ret_dict = manager.dict()

    input_1 = 42
    input_2 = 43

    process_1 = Process(target=sum1, args=(input_1, ret_dict))
    process_2 = Process(target=sum2, args=(input_2, ret_dict))

    process_1.start()
    process_2.start()
    process_1.join()
    process_2.join()

    print(ret_dict)


if __name__ == "__main__":
    main()

输出为{'sum1': 43, 'sum2': 45},它应在大约一秒钟内完成(而不是顺序运行时大约需要两秒钟)。

如果您可以解决问题,也请考虑using multiprocessing.Pool

threading相反,multiprocessing模块“回避” GIL (Global Interpreter Lock),这是CPython解释程序用来确保只有一个线程在一个线程处执行Python字节码的”机制。时间”,用于确保线程安全,但严重降低了使用线程的效率。 multiprocessing基于过程的方法为此使用了单独的过程,因此不会遇到此问题。

这对于受CPU约束且进程之间的通信不太多的问题(任务队列等很好)的问题很有效。

但是,有一个切合实际的建议:很多时候人们认为他们想要多进程/多线程,他们确实有一个受I / O约束的方案,并且他们确实需要异步I / O,不一定是多线程。对于这些情况,请查看asyncio模块。