9
votes

Est-il possible d'obtenir des objets de verrouillage de sous-classe () dans Python? Sinon, d'autres moyens de déboguer une impasse?

Donc, j'ai un programme Python multithread, qui souffre actuellement d'une impasse. J'allais faire un journal de lock Acquérir en sous-classing threading.lock Objects: xxx pré>

Lorsque j'essaie d'exécuter le programme, je reçois l'erreur suivante: p>

    class DebugLock(threading.Lock):
TypeError: Error when calling the metaclass bases
    cannot create 'builtin_function_or_method' instances  


0 commentaires

3 Réponses :


17
votes

Vous pouvez simplement utiliser le "a un verrou" versus "est une approche de verrouillage", comme: xxx pré>

où j'ai jeté dans les gardes contextuels appropriés depuis que vous voulez probablement Utilisez le avec la syntaxe code> avec vos serrures (qui ne le feriez pas?). P>

Utilisation indiquée ci-dessous: P>

    >>> lock = DebugLock()
    >>> with lock:
    ...     print("I'm atomic!")
    ... 
    acquired <__main__.DebugLock object at 0x7f8590e50190>
    I'm atomic!
    released <__main__.DebugLock object at 0x7f8590e50190>
    >>>


0 commentaires

4
votes

Russ a répondu à la question importante (n ° 2), je vais répondre à la question n ° 1.

ne semble pas être possible. threading.lock () est une fonction d'usine ( Documentation ). Ça appelle thread.allocactor_lock () - il n'y a pas de contrôle sur la création d'objets de verrouillage. Vous ne pouvez pas non plus choisir la définition de la classe thread.locktype (le squelette de classe exposé dans fil.pi). P>

>>> thread.LockType.foo = "blah"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can't set attributes of built-in/extension type 'thread.lock'


0 commentaires

3
votes

Si vous voulez faire quelque chose comme héritage sans courir dans cette erreur, je vous suggère d'essayer xxx

ma méthode normale d'utilisation auto .__ DICT __. Mise à jour (verrouillage .__ DICT__) ne semble pas fonctionner. J'ai testé cela avec le code de verrouillage xxx

et qui se bloque, alors je pense que cela fonctionne.


0 commentaires