#!/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. java_JDK8中新增的时间API

    java.time 包含值对象的基础包 java.time.chrono 提供对不同的日历系统的访问 java.time.format 格式化和解析时间的日期 java.time.temporal 包 ...

  2. MVC中DropDownListFor的使用注意事项

    1.在MVC的View页面中使用DropDownListFor时当DropDownListFor是列表是通过后台ViewBag传过来时,当ViewBag中的Key与DropDownListFor一致时 ...

  3. umount:将文件设备卸载

    [root@centos57 ~]# umount /dev/hda1 用设备文件名来卸载 [root@centos57 ~]# umount /aixi                     用挂 ...

  4. nodejs vue 微信公众号开发(二)申请微信测试号

    1.打开微信测试公众号开发平台http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login 扫码登陆

  5. 2-sat——hdu3062

    对于怎么建边还是不太清楚 选了a,那么b c不选,所以连边 选了b或c,那么a必定不选 /* 每个点拆成i*2,i*2+1 队长选,那么队友不选 队长不选,那么队友必定要选 */ #include&l ...

  6. angularjs中使用swiper时不起作用,最后出现空白位

    controller.js中定义swipers指令: var moduleCtrl = angular.module('newscontroller',['infinite-scroll','ngTo ...

  7. 洛谷P5104 红包发红包

    题目链接: P5104 题目分析: 题目和\(n\)是没什么关系的,因为是\(n\)个人抢,其实不一定抢完 其实很显然--就是求一个连续型随机变量的期望 首先设一个随机变量\(X\),表示第一个人拿到 ...

  8. 实用的 JavaScript 调试小技巧

    ‘debugger;’ 除了console.log,debugger就是另一个我很喜欢的快速调试的工具,将debugger加入代码之后,Chrome会自动在插入它的地方停止,很像C或者Java里面打断 ...

  9. An invalid property 'jdbcType ' was found in mapping

    大概2种原因: 1 放进去的类型与字段的类型不匹配 2 比较变态,xml中=两边不能有空格! 错误示例如下:  #{plat,jdbcType = INTEGER}, 去掉空格后: #{plat,jd ...

  10. 03_springmvc整合mybatis

    一.整合思路 springmvc+mybaits的系统架构: 第一步整合dao层:mybatis和spring整合:通过spring管理mapper接口,使用mapper的扫描器自动扫描mapper接 ...