python - Python 3.8 中的多处理
问题描述
我第一次尝试在 python 中使用多处理。我写了一个基本的素数搜索程序,我想在每个核心上同时运行它。问题是:当程序执行多处理时,它不仅执行“primesearch”功能,而且还执行代码的开头。我的预期输出将是一个介于 0 和一个限制之间的素数列表,但它写了 16 次(我有 16 个内核和 16 个进程)“输入一个限制:”
这是我的代码:
import time
import os
from multiprocessing import Process
# Defining lists
primes = []
processes = []
l = [0]
limit = int(input('Enter a limit: '))
def primesearch(lower,upper):
global primes
for num in range(lower, upper):
if num > 1:
for i in range(2, num):
if (num % i) == 0:
break
else:
primes.append(num)
# Start the clock
starter = time.perf_counter()
#Dividing data
step = limit // os.cpu_count()
for x in range(os.cpu_count()):
l.append(step * (x+1))
l[-1] = limit
#Multiprocessing
for init in range(os.cpu_count()):
processes.append(Process(target=primesearch, args=[l[init], l[init + 1],] ))
for process in processes:
process.start()
for process in processes:
process.join()
#End clock
finish = time.perf_counter()
print(primes)
print(f'Finished in {round(finish-starter, 2)} second')
可能是什么问题呢?
解决方案
您正在使用 Windows - 如果您阅读 Python 文档进行多处理,它将向您表明您应该使用保护您的主代码if __name__==“__main__”:
这是因为在 Windows 上,每个进程都重新执行完整的主 .py 文件。
这几乎在文档中的每个示例中都有使用,并在最后的“编程指南”部分中进行了解释。
推荐阅读
- c# - SSRS 渲染在深奥的上下文中失败
- reactjs - apollo 客户端 refetchQueries 和 onCompleted 哪个是第一个?
- testing - 如何在 jsf Web 应用程序中使用 jmeter 提取元素的随机 ID 值
- java - CopyOnWriteArrayLIst 中不允许对迭代器进行删除操作
- ms-office - range.formulas 分配未更新 Excel 加载项中的公式栏
- python - Python 模块名称相互矛盾,具体取决于您从何处运行代码
- javascript - 将修改后的数组返回到句子字符串中
- javascript - RxJS“点”与“管道”抽象
- express - Express-browserify 和 Watson Visual Recognition - TypeError: fs.existsSync 不是函数
- angular - Resolver 或 Guard - 更适合使用 ngrx 获取数据