記事「市場シミュレーション(第13回):ソケット(VII)」についてのディスカッション

 

新しい記事「市場シミュレーション(第13回):ソケット(VII)」はパブリッシュされました:

xlwingsなど、Excelへの直接的な読み書きを可能にするパッケージを用いて何かを開発する場合には、すべてのプログラム、関数、または手続きは実行され、その処理を完了すると同時に終了するという点に注意する必要があります。どれだけ工夫をしても、それらを継続的なループ処理として動作させ続けることはできません。

前回の「市場シミュレーション(第12回):ソケット(VI)」では、複数のクライアントに対応できるPythonサーバーを作成しました。このサーバーはスレッドを用いて動作します。これにより、スレッドがどのように機能するかという基本的な考え方は、ある程度イメージできたと思います。さらに重要なのは、サーバーがどのようにして簡易的なチャット機能を実現しているかを理解できたことだと思います。ソケットに関する説明の目的は、それらを網羅的に学ぶことではなく、仕組みを理解することにあります。この知識は、後のリプレイ/シミュレーションシステムで必要になります。

しかし、このPythonサーバーは複数クライアントで動作するようには設計されていますが、Excel内での利用を前提にはしていません。つまり、xlwingsを使ってこのサーバーをExcelに統合した場合、Excelとのやり取りで問題が発生します。では、スレッドを使って処理のブロックを回避しているにもかかわらず、なぜ問題が起きるのでしょうか。

これは、あるプログラムが別のプログラム(それ自体の一部ではないもの)を利用する仕組みに慣れていない人にとっては、やや複雑な問題です。少し分かりにくい表現かもしれませんが、順を追って見ていきましょう。Excel内でVBAスクリプトを実行するということは、実質的には一つのプログラムを動かしていることになります。そのスクリプトが別のアプリケーションを呼び出す場合、通常Excelはその処理が完了するまで待機します。ただし、常にメッセージを返すわけではありません。Excelがアプリケーションの実行完了を待機しないようにするためには、Excelと直接連携していないアプリケーションを使用することができます。つまり、ExcelとVBAを持つ別アプリケーションを並行して動作させるということです。この場合、両者はCPUを巡って競合することなく動作できます。これは、ExcelにWordを開かせるようなものです。Wordがフリーズしても、それがExcelの動作に影響することはありません。


作者: Daniel Jose