python - 将进度条应用于 multiprocessing.Pool(threads).apply(function)
问题描述
我想为没有要传递的参数的函数应用多处理池的进度条。(将进度条应用于 multiprocessing.Pool(threads).apply(function) )
accounts = []
def a():
for account in accounts:
while True:
try:
#tasks
exept:
continue
break
def main():
threads = int(input('Enter Threads: '))
p= multiprocessing.Pool(threads)
p.apply(a)
if __name__ == '__main__':
main()
所以我想在一个进度条中检查所有线程中的帐户进度!
解决方案
您当前的代码没有执行任何类型的多线程,因为该apply
方法会阻塞直到a
完成处理。此外,a
正在逐个处理每个元素,accounts
而您真正想要做的是accounts
根据池中的线程数并行处理元素。
在下面的代码中,函数a
现在只处理一个帐户。主进程为列表apply_async
中的每个元素调用不阻塞的方法,accounts
指定在完成处理并返回结果时要调用的回调函数(它隐式返回)。这个回调函数只是将进度条前进一个单位。a
None
from multiprocessing.pool import ThreadPool
import tqdm
def a(account):
""" process account """
import time
# simulate doing something
time.sleep(.5)
def update_progress_bar(result):
# result is return code from a, which is None
progress_bar.update(1) # one more task completed
def main():
global progress_bar
accounts = [1,2,3,4,5,6,7,8,9,10,11,12]
num_threads = int(input('Enter number of threads: '))
p = ThreadPool(num_threads)
with tqdm.tqdm(total=len(accounts)) as progress_bar:
for account in accounts:
p.apply_async(a, args=(account,), callback=update_progress_bar)
# wait for all submitted tasks to complete:
p.close()
p.join()
if __name__ == '__main__':
main()
推荐阅读
- angular - Angular 2 + 重置组件库控件
- powershell - Powershell 仅在我运行 .ps1 文件时出错
- java - Android:以编程方式与预览之间的约束布局差异
- c# - 无法加载 pdb 符号阅读器
- mdx - MDX 非空日期和相同维度的日期之间的差异
- vue.js - 视频背景组件
- angular - 类中的抽象属性不能在构造函数中访问
- json - 试图将 JSON 打包成 VBscript 并不断出错
- python - macOS 终端和 Python 中断
- python - 使用 SSH 在 Raspberry Pi 上执行一个命令,该命令允许在另一个 Raspberry Pi 上运行 .py 脚本