我在使用多处理时写了这个简单的代码。
from multiprocessing import Process, cpu_count
import time
def counter(num):
count = 0
while count < num:
count += 1
def main():
print(cpu_count())
a = Process(target=counter, args=(250000000,))
b = Process(target=counter, args=(250000000,))
c = Process(target=counter, args=(250000000,))
d = Process(target=counter, args=(250000000,))
a.start()
b.start()
c.start()
d.start()
a.join()
b.join()
c.join()
d.join()
print("Finished in:", time.perf_counter(), "seconds")
if __name__ == "__main__":
main()
嗯,我的代码中的所有内容都进展顺利,除了
time.perf_counter()
给了一个程序大约 7000 秒的时间,而这个程序甚至只花了 2-3 秒。我尝试使用 time.perf_counter_ns()
但它没有达到我的预期。首先,它给了我科学形式的值,当我将纳秒转换为秒时,它仍然给了我与之前相同的结果。而不是那些,我尝试使用 timeit 模块打印timeit.timeit()
,它确实给了我像 0.0143249234 这样的值,用于一个花费超过 2 秒的程序。当我打印 cpu_cores 而不是显示我的电脑有多少个核心时,它确实给了我这个<bound method BaseContext.cpu_count of <multiprocessing.context.DefaultContext object at 0x000001B68DDCD1C0>>
。
您面临的问题是该模块给出了特定时间的小数秒时间,但没有给出经过的时间。因此,您应该在开始时和结束时提及该模块一次,然后减去这两个值。 对于 print(cpu_cores()) ,您可能忘记提及括号,因此您获得的是核心的位置而不是实际的核心。
我已经修复了您的代码,并在下面提供了它。
from multiprocessing import Process, cpu_count
import time
def counter(num):
count = 0
while count < num:
count += 1
def main():
print(cpu_cores())
start_time = time.perf_counter()
a = Process(target=counter, args=(100000,))
a.start()
a.join()
end_time = time.perf_counter()
print("Finished in:", end_time - start_time, "seconds")
if __name__ == "__main__":
main()