多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# 线程和多处理 *版本0.13.0中的新功能。* ## 线程 虽然xlwings在技术上并不是线程安全的,但只要你至少拥有v0.13.0并坚持一个简单的规则,它仍然很容易在线程中使用它:不要将xlwings对象传递给线程。 此规则不是macOS的要求,但如果您希望程序是跨平台的,则仍建议使用此规则。 请参考下面的例子,它将**不**起作用: ~~~ import threading from queue import Queue import xlwings as xw num_threads = 4 def write_to_workbook(): while True: rng = q.get() rng.value = rng.address print(rng.address) q.task_done() q = Queue() for i in range(num_threads): t = threading.Thread(target=write_to_workbook) t.daemon = True t.start() for cell in ['A1', 'A2', 'A3', 'A4', 'A5', 'A6', 'A7', 'A8', 'A9', 'A10']: # 这不起作用-将XLwings对象传递到线程将失败! rng = xw.Book('Book1.xlsx').sheets[0].range(cell) q.put(rng) q.join() ~~~ 要使其工作,您只需要完全限定线程中的单元格引用,而不是传递`Book`对象: ~~~ import threading from queue import Queue import xlwings as xw num_threads = 4 def write_to_workbook(): while True: cell_ = q.get() xw.Book('Book1.xlsx').sheets[0].range(cell_).value = cell_ print(cell_) q.task_done() q = Queue() for i in range(num_threads): t = threading.Thread(target=write_to_workbook) t.daemon = True t.start() for cell in ['A1', 'A2', 'A3', 'A4', 'A5', 'A6', 'A7', 'A8', 'A9', 'A10']: q.put(cell) q.join() ~~~ ## 多处理 >[info]注意 多处理仅在Windows上支持! 同样的规则适用于多处理和线程,这是一个工作示例: ~~~ from multiprocessing import Pool import xlwings as xw def write_to_workbook(cell): xw.Book('Book1.xlsx').sheets[0].range(cell).value = cell print(cell) if __name__ == '__main__': with Pool(4) as p: p.map(write_to_workbook, ['A1', 'A2', 'A3', 'A4', 'A5', 'A6', 'A7', 'A8', 'A9', 'A10']) ~~~