使用Python进程进行多处理

时间:2018-08-23 16:35:15

标签: python process parallel-processing multiprocessing

我正在尝试将Python脚本修改为带有“ Process”的多进程。问题是它不起作用。第一步,依次检索内容(test1,test2)。在第二个中,将并行调用它(test1和test2)。几乎没有速度差异。如果单独执行这些功能,则会发现有所不同。我认为,并行化只需要最长的单个过程即可。我在这里想念什么?

import multiprocessing
import time

def test1(k):
           k = k * k
           for e in  range(1, k):
                          e = e**k
def test2(k):
           k = k * k
           for e in  range(1, k):
                          e = e + 5 - 5*k ** 4000
if __name__ == '__main__':

           start = time.time()
           test1(100)
           test2(100)
           end = time.time()
           print(end-start)

           start = time.time()
           worker_1 = multiprocessing.Process(target=test1(100))
           worker_1.start()

           worker_2 = multiprocessing.Process(target=test2, args=(100,))
           worker_2.start()

           worker_1.join()
           worker_2.join()
           end = time.time()
           print(end-start)

我想补充一点,我检查了任务管理器,发现只使用了1个内核。 (4个真正的Core仅使用25%CPU =>使用1Core 100%)

我知道池类,但是我不想使用它。

谢谢您的帮助。

更新

大家好, 带有“ typo”字样的人是不利的。对于那个很抱歉。 Bakuriu,谢谢您的回答。实际上,您是对的。我认为这是拼写错误,而且工作太多。 :-(因此,我再次更改了示例。对于所有感兴趣的人:

我创建了两个函数,在主体的第一部分中,我按顺序运行了3次函数。我的电脑大约需要36秒然后,我开始两个新过程。这些在此处并行计算其结果。作为一个小的补充,程序本身的皮肤进程也会计算功能test1,这应表明主程序本身也可以执行某些操作。我的计算时间为12秒。因此,它对于Internet上的所有人都是可理解的,这意味着我曾经在此处附加图片。 Task Manager

import multiprocessing
import time

def test1(k):
           k = k * k
           for e in  range(1, k):
                          e = e**k

def test2(k):
           k = k * k
           for e in  range(1, k):
                          e = e**k

if __name__ == '__main__':


           start = time.time()
           test1(100)
           test2(100)
           test1(100)
           end = time.time()
           print(end-start)


           start = time.time()
           worker_1 = multiprocessing.Process(target=test1, args=(100,))
           worker_1.start()

           worker_2 = multiprocessing.Process(target=test2, args=(100,))
           worker_2.start()

           test1(100)

           worker_1.join()
           worker_2.join()
           end = time.time()
           print(end-start)

1 个答案:

答案 0 :(得分:0)

您的代码按顺序执行,因为您没有传递test1Process的{​​{1}}参数,而是传递了target结果来吧!

您要这样做:

test1

与您在另一个呼叫中所做的一样,不是

worker_1 = multiprocessing.Process(target=test1, args=(100,))

此代码首先执行worker_1 = multiprocessing.Process(target=test1(100)) ,然后返回test1(100),然后将其分配给None,产生“空进程”。之后,您将产生另一个执行target的进程。因此,您将依次执行代码,并增加产生两个进程的开销。