Если хотите, вы можете просто синхронизировать доступ к общему ресурсу с 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()
Суть в том, что вышеуказанный объект потенциально может быть разделен между несколькими потоками без глубокого копирования путем осторожного использования блокировок. Нетривиально идентифицировать все случаи, когда это может быть необходимо, а тонкозернистые стратегии блокировки могут быть более сложными для отладки и по-прежнему приводить к накладным расходам.
Тем не менее, вам может вообще не понадобиться потоки, блокировки или глубокая копия, и без тестирования вашего кода неясно, есть ли у вас проблемы с производительностью, которые необходимо решить. Мне интересно, что заставляет вас думать, что ваш код должен быть или должен быть быстрее?