あなたが好きなら、他のスレッドプログラムと同じように、共有リソースへのアクセスをthreading.Lock
と同期することができます。
ディープコピーの有無にかかわらずコードをベンチマークする価値があると思います。そうでなければ、パフォーマンスを最適化する前にパフォーマンスがどれほど良いか悪いかを判断することが重要です。たぶん遅い理由は、ディープコピーとは関係ありません。
私は、このリソースの周りにもっと細かい粒度のロックを使用できることを意味します。あなたのスレッドは共有リソースにアクセスする以上のことをしていると思います。作業を行っている複数のスレッドから利益を得ることができ、共有リソースへの書き込みを含む「クリティカルセクション」にアクセスを同期させることができます。また、共有リソースをスレッドセーフにすることを検討することもできます。たとえば、共有オブジェクト、SillyExampleFriendsList
持っている場合:ここ
class SillyExampleFriendsList(object):
"""Just manipulates a couple lists"""
def __init__(self):
self._lock = threading.RLock()
self._friends = []
self._enemies = []
def unfriend(self, x):
# we lock here to ensure that we're never in a state where
# someone might think 'x' is both our friend and our enemy.
self._lock.acquire()
self._friends.remove(x)
self._enemies.append(x)
self._lock.release()
をポイントは、上記の目的は、潜在的にロックを慎重に使用してdeepcopyことなく、複数のスレッド間で共有できるだけのことです。これが必要となる可能性があるすべてのケースを特定することは自明ではなく、細かい粒度のロック戦略をデバッグするのが難しく、オーバーヘッドを導入する可能性もあります。
スレッド、ロック、またはディープコピーはまったく必要なく、コードをベンチマークすることなく、解決する必要のあるパフォーマンス上の問題があるかどうかはわかりません。私はあなたのコードがより速くなるべきである、あるいはそうでなければならないと考えているのは何か不思議です。
十分速かったのは何でしたか?あなたのサーバーは毎秒N要求を処理できませんか? 1回のリクエストで時には時間がかかりますか?同時リクエストの数を増やすと、処理速度が低下しますか? – stderr
1回のリクエストで時間がかかりすぎません。同時リクエストの数を増やすほど、遅くなることはありません。ひねり反応器のスレッドプールサイズは25に設定されています。 – Catalin