Se ti piace, puoi semplicemente sincronizzare l'accesso alla risorsa condivisa con threading.Lock
proprio come faresti in qualsiasi altro programma a thread invece di copiarlo.
Indipendentemente da ciò, penso che valga la pena di eseguire il benchmarking del codice con e senza la deepcopy e di misurare altrimenti per capire quanto sia buona o cattiva la performance prima di fare ottimizzazioni. Forse il motivo per cui è lento non ha nulla a che fare con la deepcopy.
MODIFICA relativa all'utilizzo del blocco: Ciò che intendo è che è possibile utilizzare un blocco a grana fine su questa risorsa. Presumo che i tuoi thread stiano facendo di più che accedere a una risorsa condivisa. Puoi provare a trarre vantaggio da più thread che fanno lavoro e quindi sincronizzare l'accesso solo a quella "sezione critica" che implica la scrittura sulla risorsa condivisa. Si potrebbe anche investigare rendendo la risorsa condivisa a rischio di sicurezza. Ad esempio, se hanno un oggetto condiviso, 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()
Il punto è proprio questo il suddetto scopo potrebbe potenzialmente essere condiviso tra più thread senza deepcopy da un attento uso di blocchi. Non è banale identificare tutti i casi in cui ciò potrebbe essere necessario e le strategie di blocco a grana fine possono essere più difficili da eseguire il debug e introdurre ancora un sovraccarico.
Detto questo, potresti non aver bisogno di thread, lock o deepcopy e senza il benchmark del tuo codice non è chiaro se hai un problema di prestazioni che deve essere risolto. Sono curioso cosa ti fa pensare che il tuo codice debba essere, o deve essere, più veloce?
In che cosa è, non è abbastanza veloce? Il tuo server non è in grado di gestire N richieste al secondo? Una singola richiesta a volte richiede troppo tempo? Diventa più lento man mano che aumenti il numero di richieste simultanee? – stderr
Una singola richiesta non sta richiedendo troppo tempo. Non rallenta quanto aumento il numero di richieste simultanee. La dimensione del pool di thread twisted reactor è impostata su 25. – Catalin