安卓模拟器多线程自动化:CSV数据无重叠读取方案咨询
解决多线程读取CSV数据不重叠的问题
要实现多线程读取CSV数据不重叠,最可靠的方式是用线程安全的队列来统一管理待处理的数据。每个线程从队列中获取一行数据进行处理,队列会自动保证同一行数据不会被多个线程拿到,直到所有数据处理完毕。
以下是修改后的完整代码,关键改动已添加注释:
import subprocess import uiautomator2 as u2 import sys import threading from time import sleep import csv import queue # 导入线程安全队列模块 def start_memu_emulator(instance_id): # 你的启动模拟器代码 pass def sort_windows(): # 你的窗口排序代码 pass def start_app(emulator): # 你的启动APP代码 pass # 修改begin函数,接收当前要处理的行数据作为参数,移除全局变量依赖 def begin(emulator, row): # Input FirstName emulator.send_keys(row["Name"]) emulator.implicitly_wait(10.0) emulator(resourceId="lastName").click() # Input LastName emulator.send_keys(row["Pass"]) emulator.implicitly_wait(10.0) emulator(text="Next").click() sleep(10) def stop_memu_emulator(): # 你的停止模拟器代码 pass # 修改run_functions,让线程循环从队列取数据处理,直到队列空 def run_functions(emulator, data_queue): sort_windows() start_app(emulator) # 循环从队列取数据,直到队列为空 while True: try: # 非阻塞取数据,超时1秒避免线程一直阻塞 row = data_queue.get(timeout=1) begin(emulator, row) # 标记当前数据处理完成(可选,若需要等待所有任务完成可使用) data_queue.task_done() except queue.Empty: # 队列空了,退出循环 break stop_memu_emulator() # ---------------------- 初始化数据队列 ---------------------- data_queue = queue.Queue() with open('name.csv', 'r') as file: reader = csv.DictReader(file) # 将所有CSV行数据预加载到线程安全队列中 for row in reader: data_queue.put(row) # ---------------------- 启动模拟器并连接 ---------------------- num_threads = int(input("Enter the number of emulator threads to run: ")) # 启动指定数量的模拟器实例 for i in range(num_threads): start_memu_emulator(i) # 获取模拟器序列号 output = subprocess.run(['adb', 'devices'], capture_output=True) lines = output.stdout.decode().strip().split('\n')[1:] reader = csv.reader(lines, delimiter='\t', quoting=csv.QUOTE_NONE) serials = [row[0].split('\t')[0] for row in reader] print('Devices series:', serials) # 连接模拟器 emulators = [] for serial in serials[:num_threads]: emulator = u2.connect(serial) emulators.append(emulator) # ---------------------- 启动多线程处理数据 ---------------------- threads = [] for emulator in emulators: # 把队列作为参数传递给线程函数 thread = threading.Thread(target=run_functions, args=(emulator, data_queue)) threads.append(thread) thread.start() # 等待所有线程完成 for thread in threads: thread.join() # 可选:等待队列中所有任务都被处理完 data_queue.join()
关键改动说明:
- 线程安全队列管理数据:使用
queue.Queue存储所有CSV行数据,队列的get()方法是线程安全的,同一行数据只会被一个线程获取。 - 移除全局变量:原代码中的
first_name和last_name全局变量会导致多线程数据覆盖,改为通过参数传递当前处理的行数据。 - 线程循环处理逻辑:每个线程启动后会持续从队列取数据,直到队列为空才停止模拟器,确保所有数据都被处理。
- 非阻塞取数据:使用
get(timeout=1)避免线程在队列空时一直阻塞,超时后自动退出循环。
内容的提问来源于stack exchange,提问作者Tài Hoàng
相关产品推荐
相关产品推荐

