我正在尝试将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)
答案 0 :(得分:0)
您的代码按顺序执行,因为您没有传递test1
到Process
的{{1}}参数,而是传递了target
的结果来吧!
您要这样做:
test1
与您在另一个呼叫中所做的一样,不是:
worker_1 = multiprocessing.Process(target=test1, args=(100,))
此代码首先执行worker_1 = multiprocessing.Process(target=test1(100))
,然后返回test1(100)
,然后将其分配给None
,产生“空进程”。之后,您将产生另一个执行target
的进程。因此,您将依次执行代码,并增加产生两个进程的开销。