Valeur de retour du thread
Comment puis-je obtenir un fil de retour d'un n-uplet ou n'importe quelle valeur de mon choix à la maison mère en Python?
Vous devez vous connecter pour publier un commentaire.
Comment puis-je obtenir un fil de retour d'un n-uplet ou n'importe quelle valeur de mon choix à la maison mère en Python?
Vous devez vous connecter pour publier un commentaire.
Je vous suggère d'instancier un La file d'attente.La file d'attente avant de commencer le fil et le passer comme un des thread args: avant que le thread se termine, il
.put
s le résultat sur la file d'attente, il a reçu en argument. Le parent peut.get
ou.get_nowait
à volonté.Les files d'attente sont généralement la meilleure façon d'organiser la synchronisation des threads et de la communication en Python: ils sont intrinsèquement thread-safe, le message de passage de véhicules, la meilleure façon d'organiser le multitâche en général!-)
before the thread finishes, it .puts the result on the queue it received as an argument
vous dire que cela sera fait automatiquement par python? si non (conçu comme la conception de pointe), alors pourriez-vous préciser dans la réponse.threading.Thread
et la nouvelle méthode run() stocke tout simplement le résultat d'attributs commeself.ret = ...
(Beaucoup plus confortable serait une sous-classe de Thread qui traite les valeurs de retour / les exceptions de la cible personnalisée fonction. En effetthreading.Thread
devrait être étendue à offrir que la sortie de la boîte - comme il serait compatible avec l'ancien comportement de retour "Aucune".)Si vous étiez en appelant join() pour attendre le thread pour terminer, vous pouvez simplement attacher le résultat au Fil de l'instance elle-même, puis de le récupérer à partir du thread principal après la jointure() retourne.
Sur l'autre main, vous ne nous dites pas comment vous avez l'intention de découvrir que le thread est fait et que le résultat est disponible. Si vous avez déjà un moyen de le faire, il sera probablement le point de vous (et nous, si vous nous le dire) à la meilleure façon d'obtenir les résultats.
join()
serait le juste retour quelle que soit la méthode appelée est de retour... semble stupide qu'à la place il retourneNone
.Vous devez passer une File d'attente de l'instance en tant que paramètre, alors vous devriez .put() votre objet de retour dans la file d'attente. Vous pouvez recueillir la valeur de retour via la file d'attente.get() n'importe quel objet que vous avez mis.
Exemple:
L'utilisation de plusieurs threads:
J'utilise cette application et il fonctionne très bien pour moi. Je vous souhaite de le faire.
response = queue.get()
permettrait de relever leEmpty exception
si le fil n'était pas encore fini et susceptibles de mettre fin à une exception gérée. Même si elle a réussi à chaque fois, ça voudrait dire que chaque thread a été terminé et que peu ou pas de multi-threading jamais eu lieu.queue
sera renseignée ici. Pouvons-nous percevoir la valeur de retour dans une certaine séquence.Utilisation lambda pour envelopper votre cible en fonction de thread et de passer sa valeur de retour vers le parent fil à l'aide d'un file d'attente. (L'original de votre objectif reste inchangé, sans file d'attente paramètre.)
Exemple de code:
De sortie:
Je suis surpris que personne n'a mentionné que vous pouviez juste passer un mutables:
cela vient peut-être des questions importantes dont je suis pas au courant.
Une autre approche est de passer d'une fonction de rappel pour le thread. Cela donne un moyen simple, sûr et flexible pour renvoyer une valeur à la mère, à tout moment de la nouvelle thread.
Vous pouvez utiliser synchronisée la file d'attente module.
Pensez vous avez besoin de vérifier un utilisateur d'infos à partir de la base de données avec un id:
Maintenant vous pouvez obtenir vos données comme ceci:
POC:
Bien, dans le Python module threading, il y a état des objets qui sont associés aux serrures. Une méthode
acquire()
sera de retour quelle que soit la valeur est retournée à partir de la sous-jacentes de la méthode. Pour plus d'informations: Python État Des ObjetsBasé sur jcomeau_ictx de la suggestion. Le plus simple je suis venu à travers. Exigence ici était d'obtenir le statut de sortie staus à partir de trois différents processus en cours d'exécution sur le serveur et de déclencher un autre script si tous les trois sont des succès. Cela semble fonctionner correctement
La fonction wrapper suivant va envelopper d'une fonction existante et retourne un objet qui montre à la fois le fil (de sorte que vous pouvez appeler
start()
,join()
, etc. sur celle-ci) ainsi que l'accès/la vue de son éventuelle valeur de retour.Cela semble OK, et le
threading.Thread
classe semble être facilement étendu(*) avec ce type de fonctionnalité, alors je me demandais pourquoi il n'est pas déjà là. Est-il un défaut avec la méthode ci-dessus?(*) À noter que husanu réponse à cette question n'est exactement ce sous-classement
threading.Thread
résultant dans une version oùjoin()
donne la valeur de retour.Pour faciliter les programmes ci-dessus answeres ressembler un peu exagéré pour moi. Je voudrais fr-nicen la mutable approche: