# 线程和多处理
*版本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'])
~~~