2009-02-20 7 views
4

Je dois faire des appels liés au réseau (par exemple, aller chercher un site Web) et je ne veux pas qu'il bloque l'interface utilisateur. Dois-je utiliser le module de threading de NSThread ou python si je travaille dans pyobjc? Je ne trouve aucune information sur la façon de choisir l'un plutôt que l'autre. Notez que je ne me soucie pas vraiment du GIL de Python puisque mes tâches ne sont pas du tout liées au CPU.Module de threads NSThread ou pythons dans pyobjc?

Répondre

2

Cela ne fera aucune différence, vous obtiendrez le même comportement avec des interfaces légèrement différentes. Utilisez celui qui convient le mieux à votre système.

0

Apprenez à aimer la boucle d'exécution. Utilisez Cocoa's URL-loading system (ou, si vous avez besoin de sockets simples, NSFileHandle) et laissez-le vous appeler lorsque la réponse (ou l'échec) revient. Ensuite, vous n'avez pas du tout à traiter avec les threads (le système de chargement d'URL utilisera un thread pour vous).

La création de vos propres threads dans Cocoa est pratiquement unique lorsque vous avez une tâche importante (> 0,1 sec) que vous ne pouvez pas interrompre.

(Quelqu'un pourrait dire NSOperation, mais NSOperationQueue is broken et RAOperationQueue ne prend pas en charge les opérations concurrentes. Bien si vous avez déjà un tas de code NSOperationQueue ou voulez vraiment se préparer à travailler NSOperationQueue, mais si vous avez besoin maintenant concurrency, boucle courir ou threads.)

+0

Hey Peter, Merci pour la réponse.Ma tâche malheureusement peut bloquer potentiellement depuis longtemps que je fais des appels de service Web SOAP.J'utilise les modules de savon ZSI pour envelopper les méthodes SOAP Laissez-moi savoir si vous avez plus d'informations sur le threading pyobjc –

0

Je suis plus friands de la solution de threading natif python depuis que je pourrais rejoindre et référencer les threads autour. AFAIK, NSThread s ne prennent pas en charge la jointure de threads et l'annulation, et vous pourriez obtenir une variété de choses avec les threads python.

En outre, il est une vraie corvée que NSThread s ne peuvent pas avoir de multiples arguments, et bien qu'il y ait des solutions de contournement pour cela (comme l'utilisation de NSDictionary s et NSArray s), il est toujours pas aussi élégant et aussi simple que d'invoquer un fil avec des arguments disposés dans l'ordre/paramètres correspondants. Mais oui, si la situation vous oblige à utiliser NSThread s, il ne devrait pas y avoir de problème du tout. Sinon, c'est cool de rester avec des threads python natifs.

+0

Depuis Leopard, NSThread supporte l'annulation. –

0

J'ai une suggestion différente, principalement parce que le threading python est tout simplement horrible à cause du GIL (Global Interpreter Lock), en particulier lorsque vous avez plus d'un cpu core. Il y a une présentation vidéo qui va dans ce détail, mais je n'arrive pas à trouver la vidéo maintenant - elle a été réalisée par un employé de Google. De toute façon, vous pouvez penser à utiliser le module de sous-processus au lieu de thread (avoir un programme d'aide que vous pouvez exécuter, ou utiliser un autre binaire sur le système.) Ou utiliser NSThread, il devrait vous donner plus de performance que ce que vous peut obtenir avec des threads CPython