J'ai un code enfilé où chaque thread doit écrire dans le même fichier. Pour éviter les problèmes de concurrence, j'utilise un objet Lock.Accès aux ressources multithread - Où dois-je mettre mes serrures?
Ma question est de savoir si j'utilise le verrou correctement. Si je mets le verrou à l'intérieur de chaque thread, ce verrou est-il global ou seulement spécifique à ce thread spécifique?
Fondamentalement, dois-je créer un verrou d'abord et passe sa référence à chaque fil, ou est-ce ok pour le mettre à l'intérieur du fil comme je le fais ici:
import time
from threading import Thread, Lock
def main():
for i in range(20):
agent = Agent(i)
agent.start()
class Agent(Thread):
def __init__(self, thread_num):
Thread.__init__(self)
self.thread_num = thread_num
def run(self):
while True:
print 'hello from thread %s' % self.thread_num
self.write_result()
def write_result(self):
lock = Lock()
lock.acquire()
try:
f = open('foo.txt', 'a')
f.write('hello from thread %s\n' % self.thread_num)
f.flush()
f.close()
finally:
lock.release()
if __name__ == '__main__':
main()
Oui, vous l'avez déplacé en dehors de la méthode, mais vous le créez toujours dans le fil lui-même. N'est-ce pas un problème? –
@cgoldberd: il est créé en tant qu'attribut * class *, ce qui signifie qu'un seul sera créé pour tous les threads. C'est un meilleur endroit pour le garder car tout reste dans la classe des threads. – nosklo
gotcha. J'aime cette approche –