python协程学习

python 复制代码
import asyncio
import time
import csv
import queue
import aiosqlite
import time

conn = None
# 定义一个队列,用于传递数据
data_queue = queue.Queue()

# 启动写文件
# def callback():
#     await 
#     print(f"执行结果:{future.result()}")
async def get_connection():
    global conn
    if conn is None:
        conn = await aiosqlite.connect('lac_ci.db', check_same_thread=False)  # 在内存中创建一个临时的数据库
    return conn

async def query(row):
   
    lac = row[0]
    ci = row[1]
    
    # print("enter query")
    conn = await get_connection()
    cursor = await conn.execute("SELECT lon,lat,radius FROM LacCiT WHERE lac = ? AND ci = ?",(lac, ci))
    result = await cursor.fetchall()
    # print(result)
    # 获取查询结果的列名
        
    if(len(result)!=0): 
        result = result[0]   
        lat = result[0]
        lon = result[1]
        radius = result[2]
        # 将结果写入
        row.extend([str(lon),str(lat),str(radius)])
        # print(row)
    
    # 将处理后的行放入队列
    data_queue.put(row)
  
# 定义一个函数,用于写入数据到CSV文件
async def write_csv(filename):
    with open(filename, 'w', newline='') as file:
        writer = csv.writer(file)
        while True:
            try:
                # 从队列中获取处理后的行并写入文件
                row = data_queue.get(timeout=1)  # 设置超时以避免无限等待
                writer.writerow(row)
                data_queue.task_done()
            except queue.Empty:
                print("队列为空,说明数据已经全部处理完毕")
                break
    
async def main():
    
    start_time = time.time()  # 记录程序开始时间
    print(f"started at {time.strftime('%X')}")
    csv_file = 'lac_tt.csv'
    output_file = 'new_file.csv'
    
    
    file = open(csv_file, 'r', newline='') 
    reader = csv.reader(file)
    # row_num = reader.line_num
    # print(type(reader))
    tasks = []
    for row in reader:
        task = asyncio.create_task(query(row))
        tasks.append(task)
        
    
    # tasks.append(write_csv(output_file))
    await asyncio.gather(*tasks)
    # done, _ = await asyncio.wait(tasks, return_when=asyncio.FIRST_COMPLETED)
    await write_csv(output_file)
    
    print(f"finished at {time.strftime('%X')}")
    
    end_time = time.time()  # 记录程序结束时间
    
    elapsed_time = end_time - start_time  # 计算运行时间
    print(f"程序运行时间:{elapsed_time:.2f} 秒")

    await conn.close()
    
coro = main() # 返回一个coroutine object

# 进入 event loop
asyncio.run(coro)
相关推荐
通信仿真实验室12 分钟前
(10)MATLAB莱斯(Rician)衰落信道仿真1
开发语言·matlab
勿语&15 分钟前
Element-UI Plus 暗黑主题切换及自定义主题色
开发语言·javascript·ui
belldeep1 小时前
python:reportlab 将多个图片合并成一个PDF文件
python·pdf·reportlab
dengqingrui1232 小时前
【树形DP】AT_dp_p Independent Set 题解
c++·学习·算法·深度优先·图论·dp
我的心永远是冰冰哒2 小时前
ad.concat()学习
学习
ZZZ_O^O2 小时前
二分查找算法——寻找旋转排序数组中的最小值&点名
数据结构·c++·学习·算法·二叉树
吾爱星辰4 小时前
Kotlin 处理字符串和正则表达式(二十一)
java·开发语言·jvm·正则表达式·kotlin
ChinaDragonDreamer4 小时前
Kotlin:2.0.20 的新特性
android·开发语言·kotlin
FreakStudio4 小时前
全网最适合入门的面向对象编程教程:56 Python字符串与序列化-正则表达式和re模块应用
python·单片机·嵌入式·面向对象·电子diy
slomay4 小时前
关于对比学习(简单整理
经验分享·深度学习·学习·机器学习