如何实现threading暂停功能,每次批量发送5个username直到全部发送完成
实现方案
你可以通过分批启动线程+等待批次全完成再暂停的逻辑实现需求,修改后的完整代码如下:
import threading import time # 可配置参数 BATCH_SIZE = 5 # 每批并发数 PAUSE_SECONDS = 3 # 每批完成后的暂停时长,可自行调整 def api_send_req(source): print(f'started thread, processing username: {source}') # 此处替换为实际的API发送逻辑 time.sleep(1) # 模拟接口请求耗时,可删除 print(f'finish processing username: {source}') if __name__ == "__main__": try: file_path = "list.txt" # 用with上下文管理文件,自动释放资源 with open(file_path, "r", encoding="utf-8") as f: usernames = [line.rstrip("\n") for line in f if line.strip()] # 将用户名列表按批次大小切分 batches = [usernames[i:i+BATCH_SIZE] for i in range(0, len(usernames), BATCH_SIZE)] total_batches = len(batches) for idx, batch in enumerate(batches, 1): print(f"\n=== 处理第 {idx}/{total_batches} 批 ===") thread_list = [] # 先创建当前批次所有线程 for username in batch: # 单元素元组必须加逗号,否则会把字符串拆分为单个字符传参 t = threading.Thread(target=api_send_req, args=(username,)) thread_list.append(t) # 批量启动当前批次的所有线程 for t in thread_list: t.start() # 阻塞主线程,等待当前批次所有线程执行完成 for t in thread_list: t.join() # 最后一批处理完成后不需要暂停 if idx != total_batches: print(f"当前批处理完成,暂停 {PAUSE_SECONDS} 秒后继续下一批") time.sleep(PAUSE_SECONDS) print("\n所有用户名已全部发送完成") except IOError as err: print(f" ERROR -> {str(err)}") exit() except EOFError as err: print(f" ERROR -> {str(err)}") exit() except IndexError as err: print(f" ERROR -> {str(err)}") exit() except KeyError as err: print(f" ERROR -> {str(err)}") exit() except KeyboardInterrupt: print(" [KILLED] By user") exit()
核心修改点说明
- 新增可配置的批次大小、暂停时长参数,灵活适配不同场景需求
- 修复原代码语法问题:修正线程传参的元组语法错误、统一threading模块的导入使用、替换了保留字
list作为变量名的错误写法 - 新增列表分块逻辑,将所有用户名按每5个一组拆分
- 每批线程启动后调用
join()方法阻塞主线程,确保当前批所有线程执行完毕后再触发暂停逻辑 - 优化文件读取逻辑,使用with上下文管理器自动处理文件关闭,避免资源泄漏
- 增加批次处理进度提示,方便查看运行状态
内容的提问来源于stack exchange,提问作者John Son
相关产品推荐
相关产品推荐

