スレッド化およびマルチプロセス化#
バージョン 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:
myrange = q.get()
myrange.value = myrange.address
print(myrange.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']:
# THIS DOESN'T WORK - passing xlwings objects to threads will fail!
myrange = xw.Book('Book1.xlsx').sheets[0].range(cell)
q.put(myrange)
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()
マルチプロセス化#
注釈
マルチプロセス化のサポートは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'])