11
votes

Mélanger le python tordu avec un multitraitement?

J'ai besoin d'écrire un programme de proxy comme Python, le flux de travail est très similaire à un proxy Web. Le programme se trouve entre le client et le serveur, invitant les demandes d'inception envoyées par le client sur le serveur, traitez la demande, puis envoyez-la sur le serveur d'origine. Bien sûr, le protocole utilisé est un protocole privé utilise TCP.

Pour minimiser les efforts, je souhaite utiliser Python torsadé pour gérer la demande de réception (la pièce agit en tant que serveur) et renvoyer (la pièce agit en tant que client).

Pour maximum les performances, je souhaite utiliser le multiprocession de Python (le filetage a la limite de GIL) pour séparer le programme en trois parties (processus). Le premier processus fonctionne tordé pour recevoir des demandes, placez la demande dans une file d'attente et retourne immédiatement au succès du client d'origine. Le deuxième processus prend la demande de la file d'attente, traiter la demande plus loin et le mettre à une autre file d'attente. Le 3ème processus Prenez la demande de la 2e file d'attente et envoyez-la sur le serveur d'origine.

J'étais un nouveau venu à Python Twisted, je sais que c'est l'événement conduit, j'ai aussi entendu dire qu'il est préférable de ne pas mélanger tordé de filetage ou de multiprocession. Donc, je ne sais pas si cette façon est appropriée ou y a-t-il un moyen plus élégant en utilisant simplement tordu?


1 commentaires

Je soupçonne que l'utilisation de 3 processus au lieu de 1 est redondant. Le 1er et le dernier processus ne font pas de traitement liée à la CPU de toute façon ... ils ne sont que io liés. En mettant tout en place dans un seul processus de réacteur torsadé sans threads et uniquement la logique asynchronisation / base d'événement, vous obtiendrez probablement un résultat plus maintenu et mieux performant.


3 Réponses :


4
votes

ampoule est la première chose à laquelle je pense en lisant votre question.

C'est une implémentation de pool de processus simple qui utilise le protocole AMP pour communiquer. Vous pouvez utiliser la fonction DEFERTOAMPROCESS , c'est très facile à utiliser.


0 commentaires

18
votes

Twisted a sa propre façon d'exécution de sous-processus à rouler sur les événements qui est (dans mon humble, mais correct, d'avis) mieux que le module multiprocessionnaire . L'API COE est Prawnprocess , mais des outils tels que fournit des emballages de niveau supérieur dessus.

Si vous utilisez Sprawnprocess , vous serez en mesure de gérer la production des sous-processus de la même manière que vous géreriez tout autre événement de Twisted; Si vous utilisez multiprocessionnaire , vous devez développer votre propre manière basée sur la file d'attente d'obtenir une sortie à partir d'une sous-processus dans l'en quelque sorte Twisted Mainloop, car la normale CallFromthread API qu'un thread pourrait utiliser ne fonctionnera pas d'un autre processus. En fonction de la façon dont vous l'appelez, il essaiera d'essayer de corroger le réacteur ou d'utiliser un réacteur différent sans travail dans la sous-processus; de toute façon, cela perdra votre appel pour toujours.


3 commentaires

Cela semble être la réponse que j'attendais, merci Glyphe. Cependant, je suis toujours dans l'apprentissage tordu et je ne comprends pas tout à fait ce que les termes que vous avez mentionnés comme «Prawnprocess» ou «CallFromthread» de la moyenne tordu, je reviendrai pour vous faire savoir quand je commence à coder.


Sprawnprocess a toujours été un lien, mais maintenant CallFromTthread est aussi. Ils vous mèneront à la documentation de l'API torsadée et j'espère que cela fera clairement ce qu'ils sont sur :).


Documentations plus accessibles que les API Docs: Utilisation de processus



0
votes

Vous pouvez essayer quelque chose comme une technique de multitâche coopérative telle qu'elle est décrite sur http: / /us.pycon.org/2010/conference/schedule/event/73/ . C'est simillar à la technique en tant que glyphe mentionnée et ça vaut la peine d'essayer.

Vous pouvez essayer d'utiliser Zeromq avec tordu mais c'est vraiment difficile et expérimental pour l'instant :)


0 commentaires