You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

安卓模拟器多线程自动化: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()

关键改动说明:

  1. 线程安全队列管理数据:使用queue.Queue存储所有CSV行数据,队列的get()方法是线程安全的,同一行数据只会被一个线程获取。
  2. 移除全局变量:原代码中的first_name和last_name全局变量会导致多线程数据覆盖,改为通过参数传递当前处理的行数据。
  3. 线程循环处理逻辑:每个线程启动后会持续从队列取数据,直到队列为空才停止模拟器,确保所有数据都被处理。
  4. 非阻塞取数据:使用get(timeout=1)避免线程在队列空时一直阻塞,超时后自动退出循环。

内容的提问来源于stack exchange,提问作者Tài Hoàng

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 10:21:12