Si lo desea, puede sincronizar el acceso al recurso compartido con threading.Lock
tal como lo haría en cualquier otro programa en lugar de copiarlo.
Independientemente, creo que vale la pena comparar su código con y sin la función de profundidad y de otra manera medir para descubrir qué tan bueno/malo es realmente el rendimiento antes de realizar optimizaciones. Quizás la razón por la cual es lenta no tiene nada que ver con la copia profunda.
EDITAR con respecto al uso de bloqueo: Lo que quiero decir es que puede usar un bloqueo de grano más fino alrededor de este recurso. Supongo que tus hilos están haciendo más que acceder a un recurso compartido. Puede tratar de beneficiarse de múltiples hilos de trabajo y luego sincronizar el acceso a la única "sección crítica" que implica escribir en el recurso compartido. También puede investigar haciendo que su recurso compartido sea seguro para los hilos. Por ejemplo, si tiene un objeto compartido, 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()
El punto aquí es simplemente que el objetivo anterior potencialmente podría ser compartida entre múltiples hilos sin deepcopy por el uso cuidadoso de las cerraduras. No es trivial identificar todos los casos en que esto sea necesario y las estrategias de bloqueo de granularidad fina pueden ser más difíciles de depurar y aún así introducir una sobrecarga.
Dicho esto, es posible que no necesite ningún tipo de subprocesos, bloqueos o deepcopy y sin una evaluación comparativa de su código no está claro si tiene un problema de rendimiento que deba resolverse. Tengo curiosidad por saber qué hace que pienses que tu código debe ser o debe ser más rápido.
¿En qué estaba no es lo suficientemente rápido? ¿Su servidor no puede manejar N solicitudes por segundo? ¿A veces una sola solicitud lleva demasiado tiempo? ¿Se vuelve más lento a medida que aumenta el número de solicitudes simultáneas? – stderr
Una sola solicitud no tarda demasiado. No se vuelve más lento ya que aumente el número de solicitudes simultáneas. El tamaño de la agrupación de subprocesos del reactor retorcido está establecido en 25. – Catalin