同一ワークブックの同時アクセスおよび例外送出について
Note
OSBXLでは、 同一Excelファイルに対し、createWorkBook や openWorkBook から WorkBook#close メソッドまでの単一性、逐次性が保証 されます。
それ故、ファイルの同時アクセスの問題を心配する必要がありません。
Python上で非同期処理も可能です。同一Excelファイルへの複数アクセスに関しては、逐次処理となります(待ち受けキューの先頭から処理されます)
Note
OSBXLでは、 バックエンド側でバリデーション例外が起きた時、pyosbxl.PyXlValidationExceptionが送出され 、pytnonのコードでハンドリング可能です。
(try ~ except pyosbxl.PyXlValidationException ロジックで、例外ハンドリング出来ます。)
非同期処理および例外処理のサンプル
以下のコードは、非同期処理で、2並列同時実行を行う例です。
createWorkBookでファイルを新規作成しますが、既にファイルが存在した場合、openWorkBookでファイルオープンに切り替えます。
import random
import pyosbxl
import pyosbxl.enums
import asyncio
import os
import traceback
app = pyosbxl.App()
async def func(n : int):
print("start" + str(n))
try:
# 新規ワークブックを作成しようとします。
#(同一Excelファイルの複数アクセスに対しては、バックエンド側(C++)側でロックをかけるため、アクセスの早い順に単一処理されます)
# つまり、同一Excelファイルに対し、createWorkBook や openWorkBook から WorkBook#close メソッドまでの単一性、逐次性が保証されます。
# それ故、Webのサーバーサイドのプログラムなどでは、同一ファイルの複数アクセスについて、考慮する必要がありません。
wb = app.createWorkBook("hello.xlsx", pyosbxl.enums.XlFont.MS_PGOTHIC, 12.0)
# pyosbxlでは、pyosbxl.PyXlValidationExceptionがサーバー側でのバリデーション失敗時に例外送出されます。
# このサンプルでは、同時にfuncメソッドを2つ並列処理しますが、2つ目の並列処理が実行された際に、例外を投げます。
# 上の説明に書いた、createWorkBook や openWorkBook から WorkBook#close メソッドまでの単一性が保証されているため、
# 1つ目の並列処理が終わった時点で、ファイルが作成され、2つ目の並列処理のcreateWorkBookに失敗するからです。
except pyosbxl.PyXlValidationException:
# 例外内容を出力します。
traceback.print_exc()
# openWorkBook に切り替えます。
wb = app.openWorkBook("hello.xlsx")
ws = wb.openWorkSheet("Sheet1")
for i in range(1,100):
for j in range(1,100):
num = random.randint(1,100)
# ワークシートのセルに値を設定します。
ws.getCells(i,j).setNumberValue(num)
# ワークブックを保存します。
wb.save()
# ワークブックを閉じ、ワークブックのメモリを解放します。
wb.close()
print("end" + str(n))
async def exec():
# funcメソッドを2並列で同時実行します。
await asyncio.gather(
func(1),
func(2),
)
if __name__ == "__main__":
if os.path.isfile("hello.xlsx"):
os.remove("hello.xlsx")
# 非同期処理を行います。
asyncio.run(exec())
print("endAll")