Comments on: Le pattern observer en utilisant des décorateurs http://sametmax.com/le-pattern-observer-en-utilisant-des-decorateurs/ Deux développeurs en vadrouille qui se sortent les doigts du code Wed, 05 Feb 2014 12:15:31 +0000 hourly 1 http://wordpress.org/?v=3.3.1 By: Sam http://sametmax.com/le-pattern-observer-en-utilisant-des-decorateurs/#comment-3456 Sam Fri, 23 Nov 2012 03:04:18 +0000 http://sametmax.com/?p=2591#comment-3456 Oui, mais avec le <a href="http://blip.tv/carlfk/mindblowing-python-gil-2243379" rel="nofollow">GIL</a>, on n'a pas d'options non bloquantes valables en Python, c'est une des limitations du langage. Il n'existe pas de possibilité de faire quelque chose de complètement asynchrones, même en utilisant des threads. Au mieux on peut faire: - des threads / des coroutines qui au moins évitent de bloquer les IO. - utiliser le module <a href="http://sametmax.com/remplacer-les-threads-avec-le-module-multiprocessing-en-python/" rel="nofollow">multiprocessing</a>, mais ça veut dire créer un process pour chaque trigger. Et dans tous les cas, ça veut dire des races conditions possibles sur les ressources partagées. Bref, si on veut vraiment un truc asynchrone en Python (c'est rare, mais ça arrive), on doit se tourner vers des frameworks types twisted ou tornado, qui eux implémente le truc en C derrière. Oui, mais avec le GIL, on n’a pas d’options non bloquantes valables en Python, c’est une des limitations du langage.

Il n’existe pas de possibilité de faire quelque chose de complètement asynchrones, même en utilisant des threads. Au mieux on peut faire:

- des threads / des coroutines qui au moins évitent de bloquer les IO.
- utiliser le module multiprocessing, mais ça veut dire créer un process pour chaque trigger.

Et dans tous les cas, ça veut dire des races conditions possibles sur les ressources partagées.

Bref, si on veut vraiment un truc asynchrone en Python (c’est rare, mais ça arrive), on doit se tourner vers des frameworks types twisted ou tornado, qui eux implémente le truc en C derrière.

]]>
By: anthony http://sametmax.com/le-pattern-observer-en-utilisant-des-decorateurs/#comment-3454 anthony Fri, 23 Nov 2012 02:29:10 +0000 http://sametmax.com/?p=2591#comment-3454 Si je me trompe pas implémenté comme ça c'est bloquant, e.g. j'ai une seule fonction abonnée à 'evenement1', si je trigger deux fois de suite cet l'event evenement.trigger('evenement1') evenement.trigger('evenement1') Et que la fonction abonnée bloque: @evenement('evenement1') def reagir_a_evenement(evenement): print "Oh, evenement '%s' a eu lieu" % evenement time.sleep(60) Je verrai les 2 prints à 1min d'interval. Quelle serait la bonne solution pour faire qqch de complètement asynchrone ? Utiliser dans le décorateur evenement une thread pour lancer la fonction ? Si je me trompe pas implémenté comme ça c’est bloquant, e.g. j’ai une seule fonction abonnée à ‘evenement1′, si je trigger deux fois de suite cet l’event

evenement.trigger(‘evenement1′)
evenement.trigger(‘evenement1′)

Et que la fonction abonnée bloque:

@evenement(‘evenement1′)
def reagir_a_evenement(evenement):
print “Oh, evenement ‘%s’ a eu lieu” % evenement
time.sleep(60)

Je verrai les 2 prints à 1min d’interval. Quelle serait la bonne solution pour faire qqch de complètement asynchrone ? Utiliser dans le décorateur evenement une thread pour lancer la fonction ?

]]>
By: Sam http://sametmax.com/le-pattern-observer-en-utilisant-des-decorateurs/#comment-2470 Sam Mon, 15 Oct 2012 15:06:53 +0000 http://sametmax.com/?p=2591#comment-2470 ^^ ^^

]]>
By: Recher http://sametmax.com/le-pattern-observer-en-utilisant-des-decorateurs/#comment-2469 Recher Mon, 15 Oct 2012 13:35:36 +0000 http://sametmax.com/?p=2591#comment-2469 C'est très chouette. Dans le cas où vous voudriez mon opinion personnelle que j'ai, je vous dirais que je trouve cette ligne là : <pre lang="python">evenement.abonnements = getattr(evenement, 'abonnements', {})</pre> un peu bourrine et pas super compréhensible. Si j'ai bien tout compris, le but, c'est d'initialiser l'attribut "abonnements" à un dictionnaire vide, dans le cas où il n'existe pas encore. Si il existe, on le laisse comme il est. Si l'attribut existe déjà, ça revient à faire ça : <pre lang="python">evenement.abonnements = getattr(evenement, 'abonnements')</pre> Ce qui revient à faire ça : <pre lang="python">evenement.abonnements = evenement.abonnements</pre> On affecte l'objet à lui-même. Ca ne dérange absolument pas le python de faire quelque chose de ce genre. Mais ça dérange l'humain qui lit le code. Il risque de se dire : "WTF ? C'est quoi l'intérêt ?". (Alors que le vrai intérêt de cette ligne se trouve uniquement dans le cas où l'attribut n'existe pas). Bref, moi je propose ça. C'est en deux lignes, mais ça me semble plus clair. <pre lang="python">if not hasattr(evenement, 'abonnements'): evenement.abonnements = {}</pre> C’est très chouette.

Dans le cas où vous voudriez mon opinion personnelle que j’ai, je vous dirais que je trouve cette ligne là :

evenement.abonnements = getattr(evenement, 'abonnements', {})

un peu bourrine et pas super compréhensible.

Si j’ai bien tout compris, le but, c’est d’initialiser l’attribut “abonnements” à un dictionnaire vide, dans le cas où il n’existe pas encore. Si il existe, on le laisse comme il est.

Si l’attribut existe déjà, ça revient à faire ça :

evenement.abonnements = getattr(evenement, 'abonnements')

Ce qui revient à faire ça :

evenement.abonnements = evenement.abonnements

On affecte l’objet à lui-même.
Ca ne dérange absolument pas le python de faire quelque chose de ce genre. Mais ça dérange l’humain qui lit le code. Il risque de se dire : “WTF ? C’est quoi l’intérêt ?”. (Alors que le vrai intérêt de cette ligne se trouve uniquement dans le cas où l’attribut n’existe pas).

Bref, moi je propose ça. C’est en deux lignes, mais ça me semble plus clair.

if not hasattr(evenement, 'abonnements'):
    evenement.abonnements = {}
]]>
By: Sam http://sametmax.com/le-pattern-observer-en-utilisant-des-decorateurs/#comment-2462 Sam Sun, 14 Oct 2012 17:15:08 +0000 http://sametmax.com/?p=2591#comment-2462 @DSeed: oui, exactement. @Soli: Il faut apprendre à ne pas mettre ce genre d'informations dans un exemple pédagogique. On parle de wraps dans le tutos sur les décorateurs, ici la notion expliquée est le pattern observer. Top d'info rend les explications confuses. @DSeed: oui, exactement.

@Soli: Il faut apprendre à ne pas mettre ce genre d’informations dans un exemple pédagogique. On parle de wraps dans le tutos sur les décorateurs, ici la notion expliquée est le pattern observer. Top d’info rend les explications confuses.

]]>
By: Soli http://sametmax.com/le-pattern-observer-en-utilisant-des-decorateurs/#comment-2461 Soli Sun, 14 Oct 2012 17:12:42 +0000 http://sametmax.com/?p=2591#comment-2461 Et en général, pour faciliter le débogage notamment, on n'hésitera pas à utiliser http://docs.python.org/library/functools.html#functools.wraps pour conserver/rétablir le nom de la fonction « enveloppée ». Et en général, pour faciliter le débogage notamment, on n’hésitera pas à utiliser http://docs.python.org/library/functools.html#functools.wraps pour conserver/rétablir le nom de la fonction « enveloppée ».

]]>
By: DSeed http://sametmax.com/le-pattern-observer-en-utilisant-des-decorateurs/#comment-2460 DSeed Sun, 14 Oct 2012 16:07:41 +0000 http://sametmax.com/?p=2591#comment-2460 Les signaux de django font pas la mm chose ? A part que les receivers sont des décorateurs (sans doute plus de liberté ... ) Les signaux de django font pas la mm chose ? A part que les receivers sont des décorateurs (sans doute plus de liberté … )

]]>