Question

Question:

Puis-je utiliser le module multiprocessing avec gevent sur Windows d'une manière efficace?

Scénario:

J'ai un gevent en Python application asynchronous I/O sur Windows.L'application est principalement dépendant des e/S, mais il y a des pointes de plus de CPU que de bien.Cette application a besoin pour contrôler une application de console par l'intermédiaire de son stdin et stdout.Je ne peux pas modifier cette console application et l'utilisateur sera en mesure d'utiliser son propre, seul le texte (ligne) selon le protocole de transmission est fixe.

J'ai un travail de mise en œuvre à l'aide de sous-processus et les threads, mais je préfère déplacer l'ensemble de la sous-processus de communication basé sur le code avec les threads dans un processus distinct pour activer l'application principale en arrière à mono-thread.J'ai l'intention d'utiliser le module multiprocessing pour cela.

Avant la lecture:

J'ai été chercher sur le Web un lot et de la lecture du code source, donc je sais que le multitraitement module à l'aide d'un Tuyau de mise en œuvre basée sur des canaux nommés sur Windows.Une paire de multitraitement.la file d'attente.Les objets de la file d'attente serait utilisé pour communiquer avec le deuxième Python processus.Ces files d'attente sont basés sur le Tuyau de mise en œuvre, par exemplela CIB sera fait via des canaux nommés.

La question clé est de savoir si l'appel de la File d'attente entrante de la méthode get pourrait bloquer gevent de la boucle principale ou non.Il y a un délai d'attente pour cette méthode, donc je pourrais le faire dans une boucle, avec un petit délai, mais ce n'est pas une bonne solution, car il serait encore bloquer gevent pour de petites périodes de temps de blesser sa faible latence d'e/S.

Je suis aussi ouvert à des suggestions sur la façon de contourner le problème de l'utilisation de tuyaux sur Windows, qui est connu pour être difficile et parfois fragiles.Je ne suis pas sûr de savoir si la mémoire partagée en fonction de l'IPC est possible sur Windows ou pas.Peut-être que je pourrais envelopper l'application de la console de manière à permettre la communication avec le processus de l'enfant à l'aide de sockets réseau, qui fonctionne bien avec gevent.

S'il vous plaît ne doute pas de mon cas d'utilisation principal, si possible.Merci.

Était-ce utile?

La solution

La méthode de la file d'attente est vraiment bloquée. L'utilisation avec le délai d'attente pourrait potentiellement résoudre votre problème, mais cela ne sera certainement pas une solution la plus propre et, ce qui est le plus important, introduira une latence supplémentaire sans bonne raison. Même si cela ne bloquait pas, cela ne sera pas une bonne solution non plus. Ce n'est pas suffisant, le bon appel / API asynchrone doit s'intégrer correctement dans le cadre d'E / S en cours d'utilisation. Soyez ce gevent pour Python, libelant pour C ou Boost Asio pour C ++.

La solution la plus simple consisterait à utiliser des E / S simples en accumulant vos applications de console et de la connexion à ses descripteurs de la console et de sortie. Il existe à deux facteurs majeurs à considérer:

  • Il sera extrêmement facile pour vos clients d'écrire des applications clientes. Ils n'auront pas à travailler avec une sorte d'IPC, de socket ou d'autre code, ce qui pourrait être très difficile pour beaucoup. Avec cette approche, l'application va simplement lire de Stdin et écrire sur stdout.
  • Il sera extrêmement facile de tester les applications de la console à l'aide de cette approche, car vous pouvez les démarrer manuellement, entrer du texte dans la console et voir les résultats.
  • gevent est un ajustement parfait pour async lire / écrire ici.

    Cependant, l'inconvénient est que vous devrez commencer cette application, il n'y aura aucun support pour une communication simultanée avec elle, et il n'y aura aucun support pour la communication sur le réseau. Il y a même un Bon exemple pour commencer .

    Pour le garder simple mais plus flexible, vous pouvez utiliser des sockets TCP / IP. Si le client et le serveur fonctionnent sur la même machine. En outre, un bon système d'exploitation utilisera IPC comme une implémentation sous-jacente. Il sera donc rapide. Et, si vous vous inquiétez de la performance de cette affaire, vous ne devez probablement pas utiliser Python du tout et regarder d'autres technologies.

    Solution même Fancies - Utilisez Zeroc Ice . C'est une technologie très moderne permettant une communication inter-processus presque sans soudure. C'est un tueur corba, très facile à utiliser. Il est fortement utilisé par beaucoup, prouvé être le plus rapide dans sa classe et sa rock stables. La beauté de cette solution est que vous pouvez intégrer de manière transparente des programmes dans de nombreuses langues différentes, comme Python, Java, C ++, etc., mais cela nécessitera une partie de votre temps pour vous familiariser avec un concept. Si vous décidez d'aller de cette façon, passez juste une journée de lecture de la documentation au frouche.

    J'espère que cela aide. Bonne chance!

Autres conseils

Votre question est déjà assez vieux.Néanmoins, je tiens à recommander http://gehrcke.de/gipc ce qui-je crois-de s'attaquer au décrites défi dans un très straight-forward de la mode.Fondamentalement, il vous permet d'intégrer le traitement multiple des enfants sur les processus de n'importe où dans votre application (sur Windows).L'Interaction avec Process objets (tels que l'appel à la join()) est gevent coopératif.Par l'intermédiaire de son tuyau de gestion, il permet la collaboration de blocage de la communication inter-processus.Toutefois, sur Windows, IPC actuellement est beaucoup moins efficace que sur POSIX systèmes (depuis le non-blocage I/O est imité par le biais d'un pool de threads).Selon la CIB messagerie volume de votre application, il peut ou peut ne pas être d'une grande importance.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top