#!/ufr/bin/env python
# -*- coding:utf-8 -*- import xlwings as xw import queue
import threading
import time
StopEvent = object()
class TreadPool:
def __init__(self, max_num, max_tast_num = 0):
self.max_num = max_num #最大线程数
if max_tast_num: #根据是否制定最大任务数来指定队列程度
self.q = queue.Queue() #队列不限定长度
else:
self.q = queue.Queue(max_tast_num) #根据用户指定长度创建队列
self.generate_list = [] #记录生成的线程
self.free_list = [] #记录空闲的线程
self.terminal = False
def run(self, target, args, callback=None):
"""运行该函数,调用线程池"""
if len(self.free_list) == 0 and len(self.generate_list) < self.max_num:
#没有空闲线程并且当前创建线程数量小于最大允许线程数量时允许创建线程
self.creat_thread() #调用创建线程函数
tast = (target, args, callback) #将任务打包成为元组放入队列
self.q.put(tast) def creat_thread(self):
"""创建线程,并且运行,这时调用call函数,所有实现均在call函数内"""
thread = threading.Thread(target=self.call)
thread.start()
def call(self):
"""线程调用该函数"""
current_thread = threading.currentThread() #获取执行该函数的当前线程
self.generate_list.append(current_thread) #将线程加入生成的线程列表 tast = self.q.get() #从队列中取出一个任务包 while tast != StopEvent:
target, args, backcall = tast #将元组人物包,赋值给变量
try:
result = target(*args) #执行函数,并将返回值赋值给result
except Exception as e:
result = None if backcall:
try:
backcall(result) #执行回调函数,并将result作为参数传给回调函数
except Exception as e:
pass self.free_list.append(current_thread) #执行完毕,将当前线程对象加入空闲列表
if self.terminal: #是否强制终止
tast = StopEvent
else:
tast = self.q.get() #等待那任务,如果有任务直接循环执行,如果没有则等待,一旦run方法中放入任务则继续执行任务,无需再创建线程
self.free_list.remove(current_thread) #拿到任务后,清除空闲线程
else:
self.generate_list.remove(current_thread)
def close(self):
"""所有线程全部运行完毕后,停止线程
call函数运行完毕后,所有的线程此时都在等待拿任务,此时,只要给队列里面添加StopEvent对象则线程就会结束"""
generate_size = len(self.generate_list)
while generate_size:
self.q.put(StopEvent)
generate_size -= 1
def terminate(self):
"""不等待线程全部运行完毕任务,直接终止"""
self.terminal = True #正在运行的线程运行完毕后会终止
generate_size = len(self.generate_list)
while generate_size: #终止已经在等待的那一部分线程
self.q.put(StopEvent)
generate_size -= 1 def func(li):
for i in range(10000):
li.append([i]) def world():
wb = xw.Book.caller()
li = []
pool = TreadPool(5)
for i in range(5):
pool.run(target=func, args=(li,))
pool.close()
print(li) wb = xw.Book.caller()
wb.sheets[0].range("a1").value = li

多线程写入excel

【xlwings1】多线程写入excel数据的更多相关文章

  1. 读取、写入excel数据

    在实际项目中,不可避免的会操作excel表格.一直以来都是读取excel表格,可今天为了写入excel表格,可是煞费苦心,终于完成,记录下来以便后续使用. 1.读取excel表格的数据 读取excel ...

  2. 按键精灵如何调用Excel及按键精灵写入Excel数据的方法教程---入门自动操作表格

    首先来建立一个新的Excel文档,在桌面上点击右键,选择[新建]-[Excel工作表],命名为[新手学员]. 现在这个新Excel文档是空白的,我们接下来会通过按键精灵的脚本来打开并写入一些数据.打开 ...

  3. C#中NPOI操作excel之读取和写入excel数据

    一.下载引用 下载需要引用的dll,即:NPOI.dll,NPOI.OOXML.dll,NPOI.OpenXml4Net.dll,ICSharpCode.SharpZipLib.dll(office2 ...

  4. 使用NPOI写入Excel数据(ASP.NET)

    第一次做这个写入数据的功能,研究了下npoi的类 IWorkbook wb = new HSSFWorkbook(); //创建表 ISheet sh = wb.CreateSheet("X ...

  5. python 写入excel数据而不改变excel原有样式

    目标:python写数据到excel,不改变原有样式 解决:在打开excel时,加入该参数formatting_info=True

  6. c# 读取和写入excel数据

    1. 读取 DataTable GetDataFromExcelByConn(bool hasTitle = false){    OpenFileDialog openFile = new Open ...

  7. matlab写入excel数据

    使用xlswrite 可以help xlswrite查看用法 xlswrite(filename,A)xlswrite(filename,A,sheet)xlswrite(filename,A,xlR ...

  8. Java使用POI读取和写入Excel指南

    Java使用POI读取和写入Excel指南 做项目时经常有通过程序读取Excel数据,或是创建新的Excel并写入数据的需求: 网上很多经验教程里使用的POI版本都比较老了,一些API在新版里已经废弃 ...

  9. C# 操作Excel基础篇(读取Excel、写入Excel)

    注意事项:Excel的数据表中最多只能储存65535行数据,超出后,需要将数据分割开来进行储存.同时对于Excel中的乱码象限,是由于编码的错误方式导致引起的! 一.读取Excel数据表,获得Data ...

随机推荐

  1. Python学习之--迭代器、生成器

    迭代器 迭代器是访问集合元素的一种方式.从对象第一个元素开始访问,直到所有的元素被访问结束.迭代器只能往前,不能往后退.迭代器与普通Python对象的区别是迭代器有一个__next__()方法,每次调 ...

  2. Halt- Linux必学的60个命令

    1.作用 halt命令的作用是关闭系统,它的使用权限是超级用户. 2.格式 halt [-n] [-w] [-d] [-f] [-i] [-p] 3.主要参数说明 -n:防止sync系统调用,它用在用 ...

  3. Ascii码 、16进制与 char

            对于一个非计算机专业出身的人,以前只知道计算机中所有的数据都是以二进制形式进行存储,计算,通信的.但是人类文明中,主要的信息展现以文本的形式展现的.如果使用内存中的0和1来表示文本一直 ...

  4. html--双飞翼布局

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  5. leetcode-154-寻找旋转排序数组中的最小值

    题目描述: 方法一: class Solution: def findMin(self, nums: List[int]) -> int: left, right = 0, len(nums) ...

  6. server端并发聊天

    mul_server和mul_client实现了客户端发什么消息,服务器端回复什么消息 server_dialog和mul_client实现了客户端与服务器并发通信

  7. 我眼中javascript的这些年

    写了两年多的js了吧,一开始的目标并没有很学术,我只想安安静静做个很厉害的开发者.但是总是沉溺在一种语言里,会让人误以为这种语言很厉害,就像只在村子里混的话,我觉得我自己可以逆天,村外有人,编程世界也 ...

  8. some方法过滤

    // 已经存在该tab时跳过 this.tabs.some(item => item.title === option.title) || this.tabs.push(option)

  9. 基于OneMap的水利行业共享服务平台搭建步骤

    今天上午再次学习Esri技术培训中心的“GIS服务共享与运维管理——之OneMap解决方案”课程,从中学习了OneMap的产品架构以及基于OneMap共享服务平台的搭建步骤.下面把其中水利行业的共享服 ...

  10. FreeMarker 自定义 TemplateDirectiveModel(一)

    FreeMarker 是一个用 Java 语言编写的模板引擎,它基于模板来生成文本输出.FreeMarker 与 Web 容器无关,即在 Web 运行时,它并不知道 Servlet 或 HTTP.它不 ...