xlwings1 多執行緒寫入excel資料

2022-07-27 20:54:13 字數 2890 閱讀 6388

#

!/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.creat_thread() #

呼叫建立執行緒函式

tast = (target, args, callback) #

將任務打包成為元組放入佇列

self.q.put(tast)

defcreat_thread(self):

"""建立執行緒,並且執行,這時呼叫call函式,所有實現均在call函式內

"""thread = threading.thread(target=self.call)

thread.start()

defcall(self):

"""執行緒呼叫該函式

"""current_thread = threading.currentthread() #

獲取執行該函式的當前執行緒

將執行緒加入生成的執行緒列表

tast = self.q.get() #

從佇列中取出乙個任務包

while tast !=stopevent:

target, args, backcall = tast #

將元組人物包,賦值給變數

try:

result = target(*args) #

執行函式,並將返回值賦值給result

except

exception as e:

result =none

ifbackcall:

try:

backcall(result)

#執行**函式,並將result作為引數傳給**函式

except

exception as e:

pass

#執行完畢,將當前執行緒物件加入空閒列表

if self.terminal: #

是否強制終止

tast =stopevent

else

: tast = self.q.get() #

等待那任務,如果有任務直接迴圈執行,如果沒有則等待,一旦run方法中放入任務則繼續執行任務,無需再建立執行緒

self.free_list.remove(current_thread) #

拿到任務後,清除空閒執行緒

else

: self.generate_list.remove(current_thread)

defclose(self):

"""所有執行緒全部執行完畢後,停止執行緒

call函式執行完畢後,所有的執行緒此時都在等待拿任務,此時,只要給佇列裡面新增stopevent物件則執行緒就會結束

"""generate_size =len(self.generate_list)

while

generate_size:

self.q.put(stopevent)

generate_size -= 1

defterminate(self):

"""不等待執行緒全部執行完畢任務,直接終止

"""self.terminal = true #

正在執行的執行緒執行完畢後會終止

generate_size =len(self.generate_list)

while generate_size: #

終止已經在等待的那一部分執行緒

self.q.put(stopevent)

generate_size -= 1

deffunc(li):

for i in range(10000):

defworld():

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 快速入門

前言 安裝 pip install xlwings xlwings 安裝成功後,如果執行提示報錯 importerror no module named win32api 請再安裝 pypiwin32 或者 pywin32 包 pip install pypiwin32 1 指令碼 自動化 與pyt...

SQLite 多執行緒序列寫入

確認在 sqlite3.c 中,巨集 sqlite threadsafe 1 或者 2 define sqlite threadsafe 1 imp r 07272 22309 include thread.h extern c include include utility.h int print...

python 多執行緒寫入檔案

python 多執行緒寫入檔案 在python中,對檔案的操作時很簡潔的,一般是通過開啟檔案,獲取檔案物件,然後對檔案物件進行寫入。這是file 的一些常用方法 class file object def close self real signature unknown restored from...