我在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
中只有一个线程。
谢谢
答案 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
模块。