2008-08-22 8 views
21

Comment puis-je implémenter une logique qui me permettra de reproduire sous Windows la fonctionnalité que j'ai sous Linux avec l'appel système fork(), en utilisant Python?Quelle est la meilleure façon de dupliquer fork() dans Windows?

J'essaie spécifiquement d'exécuter une méthode sur le composant SAPI Com, tout en continuant l'autre logique dans le thread principal sans bloquer ni attendre.

Répondre

3

Jetez un oeil sur les fonctions de gestion de processus dans le os module. Il y a des fonctions pour démarrer de nouveaux processus de différentes manières, à la fois synchrone et asynchrone.

Je devrais également noter que Windows ne fournit pas une fonctionnalité qui est exactement comme fork() sur d'autres systèmes. Pour effectuer un multitraitement sous Windows, vous devez utiliser le module threading.

+8

'subprocess' et' multiprocessing' (suggéré par RJBrady) pourraient être de meilleures alternatives à 'os' et 'threading'. – jfs

+1

'threading' ne fait pas de multi-traitement dans CPython. – clacke

3

En plus du code de gestion des processus dans le module os que Greg a, vous devriez aussi jeter un coup d'oeil au module de filetage: https://docs.python.org/library/threading.html

from threading import Thread 

def separate_computations(x, y): 
    print sum(x for i in range(y)) # really expensive multiplication 

Thread(target=separate_compuations, args=[57, 83]).start() 
print "I'm continuing while that other function runs in another thread!" 
2

Vous aimerez aussi à l'aide du module de traitement (http://pypi.python.org/pypi/processing) . Il a beaucoup de fonctionnalités pour écrire des systèmes parallèles avec la même API que le module de threading ...

+1

À partir de Python 2.6/3.0 (Oct et Dec 2008), 'processing' fait partie de la bibliothèque standard en tant que' multiprocessing'. – clacke

3

L'exemple Threading d'Eli exécutera le thread, mais ne fera aucun travail après cette ligne. Je vais regarder dans le module de traitement et le module de sous-processus. Je pense que la méthode com que j'exécute doit être dans un autre processus, pas seulement dans un autre thread.

+2

Le module 'multiprocessing' fait partie de la bibliothèque standard. 'subprocess' s'adapte aux programmes externes,' multiprocessing' s'adapte au code python. – jfs

10

fork()a en effet été dupliqués dans Windows, sous Cygwin, mais il est assez poilu.

L'appel de fork dans Cygwin est particulièrement intéressant car il ne correspond pas bien à l'API Win32. Cela rend très difficile à mettre en œuvre correctement.

Voir la The Cygwin User's Guide pour une description de ce hack.

16

Utilisez le python multiprocessing module qui fonctionnera partout.

Voici un IBM developerWords article qui montre comment convertir os.fork() en module multitraitement.

+1

C'est la bonne réponse, mais en raison de l'absence de 'fork()' sous Windows, il y a quelques mises en garde, la principale étant de s'assurer que tout script est protégé par un 'if __name__ ==" __main __ "' garde si c'est pour appeler n'importe quel code qui fait du multitraitement. Le processus engendré commence frais et doit charger des modules pour être capable de reconstruire l'état. – clacke

Questions connexes