#多執行緒寫入excel!/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()
(li)
wb =xw.book.caller()
wb.sheets[0].range("a1
").value = li
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...