【发布时间】:2019-07-31 22:04:32
【问题描述】:
我有大约 200 个项目要处理,这是一项每秒连续运行的工作。
我尝试了以下代码,但它看起来像处理项目数,匹配 CPU 内核。我的理解是因为 pool.map 只调度匹配 CPU 内核的进程,并且因为 BlockingScheduler 没有返回。
import multiprocessing
import time
import datetime
from apscheduler.schedulers.blocking import BlockingScheduler
def process(number):
scheduler = BlockingScheduler()
scheduler.add_job(timer, 'interval', seconds=1, args=[number])
scheduler.start()
def timer(number):
print(f"{datetime.datetime.now().time()} {number} - completed processing. ")
def run(number_to_process):
with multiprocessing.Pool() as pool:
pool.map(process, number_to_process)
if __name__ == "__main__":
number_to_process = range(1, 200)
start_time = time.time()
run(number_to_process)
所以,我尝试了以下代码。看起来它正在处理所有 200 个项目。我的问题是:在我在这里创建 200 个进程时,它是充分利用 CPU 还是有任何副作用?
from multiprocessing import Process
import time
import datetime
from apscheduler.schedulers.blocking import BlockingScheduler
def process_number(number):
scheduler = BlockingScheduler()
scheduler.add_job(timer, 'interval', seconds=1, args=[number])
scheduler.start()
def timer(number):
print(f"{datetime.datetime.now().time()} {number} - completed processing. ")
def run(number_to_process):
processes = []
for number in number_to_process:
print(number)
p = Process(target=process_number, args=(number,))
p.start()
processes.append(p)
for process in processes:
process.join()
if __name__ == "__main__":
number_to_process = range(1, 200)
start_time = time.time()
run(number_to_process)
【问题讨论】: