10
votes

L'étagère est-elle dans le fil de python en sécurité?

L'étagère est-elle utilisée pour le fil de la persistance des données? Sinon, quelle est une bonne alternative?


0 commentaires

3 Réponses :


3
votes

Alternatives: ZODB

http://www.zodb.org/


1 commentaires

(de lien) (ZODB ...) Les transactions fournissent des transactions d'isolation permettent de multiples threads logiques (threads ou processus) pour accéder à des bases de données et la base de données empêche les threads de faire des changements contradictoires.



12
votes

du Documentation de la bibliothèque standard sur le module d'étagère, sous la rubrique restrictions :

Le module d'étagère ne prend pas en charge accès simultané / écriture à objets rayonnés. (Plusieurs Les accès simultanés de lecture sont sûrs.)

Je supposerais que c'est probablement une mise en œuvre probablement dépendante et, auquel cas, pour être sûr, je conclurais que cela n'est certainement pas le fil de sécurité.


1 commentaires

Merci pour le commentaire. Dans les prochaines parties de la documentation, il est indiqué: "Lorsqu'un programme a une tablette ouverte pour écrire, aucun autre programme ne devrait l'avoir ouvert à la lecture ou à l'écriture. Unix Le verrouillage du fichier peut être utilisé pour résoudre ce problème, mais cela diffère entre les versions UNIX et nécessite des connaissances sur la mise en œuvre de la base de données utilisée. " - Ceci suggère que le module d'étagère n'est pas en sécurité à thread, à moins que vous n'ayez mis en œuvre votre propre mécanisme de verrouillage. Avez-vous un exemple qui démontre le contraire?



0
votes
Threads = # amount of threads

thread_moment = [False for _ in range(Threads)] 

def job(x):  # x would be the index of the thread  

    lock.aquire()

    # open/edit/update/close your shelve file

    thread_moment[x] = True 

    lock.release()

    while True:
        if all(thread_moment) == True:
            thread_moment = [False for _ in range(threads)]
            break
        else:
            time.sleep(1)

    # carry on with your script

1 commentaires

La question est de savoir si c'est sûr .. Comment votre code répond-il à la question?