2013-06-10 2 views
2

Selon eventlet document:python eventlet - fichier async (non bloquant) io

It uses epoll or libevent for highly scalable non-blocking I/O. 

Je sais non bloquante ici E/S couvre le cas lorsque vous interagissez avec prises. Une fois que le socket est vert/corrigé par un événement, la connexion du socket devient non bloquante.

Mes questions sont: Est-ce que cette E/S non bloquante couvre également les E/S de fichiers?

Répondre

2

Non, ce serait soit

  • vrai async IO avec callbacks: imposer des restrictions inattendues; bien sur Windows et FreeBSD si
  • non-blocage IO: désactiver le cache du système de fichiers (au moins sur Linux et FreeBSD) et toujours pas garantir que le fichier IO ne bloquerait pas (au moins sur Linux sur les systèmes de fichiers couramment utilisés)
  • pool de threads: engager des frais et des performances mémoire inattendue

pool de threads est le plus facile, moyen le plus portable et plus prévisible cependant. Vous pouvez facilement envelopper vos appels avec eventlet.tpool.execute.

+0

C'est ce que j'ai découvert aussi, comme la connexion socket, eventlet peut le rendre vert/async pas de problèmes. Mais les fichiers d'E/S, à moins de l'utiliser dans tpool, Greenpool n'a tout simplement aucun moyen de le rendre asynchrone. Donc, cela n'a pas de sens de faire des E/S de fichiers dans le fil vert, correct? Parce qu'il peut facilement bloquer tout le reste dans le même processus. – Shengjie

+0

Oui et non. Chaque opération de fichier 'open' ou autre bloque vraiment tous les threads verts. Mais le temps de blocage est généralement assez faible. D'un autre côté, si vous déployez sur un hébergement massivement partagé, comme Amazon EC2 avec une possible disfonctionnement des E/S du disque, oui, il peut bloquer pendant longtemps et ensuite "tpool" serait très utile. Mesurer tout est la clé du succès. – temoto