2013-01-05 6 views
3

Bonsoir, tout le monde. J'écris le programme multithread utilisant Python 2.7 et enfilant le module. Voici un exemple de code:Python pthread_detach analogique

# Importing myFunc function which will be run in the new thread 
from src.functions import myFunc 
# Importing a threading module 
import threading 
# Creating and running new thread initiated by our function 
# and some parameters. 
t = threading.Thread(target=myFunc, args=(1, 2, 3)) 
t.start() 

Je sais que dans C++ (bibliothèques de threads POSIX) il y a une fonction pthread_detach() qui met un fil conducteur dans l'état détaché. Il garantit que ce thread relâchera des ressources sur le système après la fin de la fonction. Donc, y a-t-il un analogue d'une telle fonction dans Python? Ou, peut-être, il n'est pas nécessaire de détacher les threads en Python, et les ressources prises par le thread seront libérées automatiquement après la fin de la fonction threadée?

J'ai essayé de rechercher des informations sur docs.python.org et Google mais c'était infructueusement.

Répondre

1

Goog matin, tout le monde. En fait, la réponse est 'il n'est pas du tout nécessaire de détacher les threads en Python'. Cette réponse m'a été donnée par le camarade GaiveR de there. Tout ce dont vous avez besoin est de regarder dans le code source de Python (thread_pthread.h):

long 
PyThread_start_new_thread(void (*func)(void *), void *arg) 
{ 
... 
    status = pthread_create(&th, 
#if defined(THREAD_STACK_SIZE) || defined(PTHREAD_SYSTEM_SCHED_SUPPORTED) 
         &attrs, 
#else 
         (pthread_attr_t*)NULL, 
#endif 
         (void* (*)(void *))func, 
         (void *)arg 
         ); 

#if defined(THREAD_STACK_SIZE) || defined(PTHREAD_SYSTEM_SCHED_SUPPORTED) 
    pthread_attr_destroy(&attrs); 
#endif 
    if (status != 0) 
    return -1; 

    pthread_detach(th); 
... 
} 
+0

Ce n'est pas si simple. Êtes-vous sûr que le code est réellement utilisé par l'interpréteur (voir le commentaire en haut de ['Python/thread.c'] (http://hg.python.org/cpython/file/8a6068ec220e/Python/thread.c# l2) (le seul endroit où 'thread_pthread.h' est utilisé))? Pour autant que je comprenne 'pthread_detach()' rend le thread unjoinable, mais les threads créés avec 'threading.Thread()' * sont * jointable. – jfs

+0

@ jf-sebastian Vous comparez des pommes avec des oranges ici: '' pthread_detach'' rend le thread système sous-jacent unjoinable, ce qui n'a rien à voir avec la méthode join de '' threading.Thread'', donc vous ne pouvez pas conclure pthread_detach n'est pas appelé. En fait, Python utilise de préférence pthreads sur Unix quand il est disponible (c'est sur Linux), et le seul appel à '' pthread_create'' dans les sources Python 2.7 est dans cette fonction, donc la réponse est correcte. [Join in Python] (https://hg.python.org/cpython/file/v2.7.10/Lib/threading.py#l911) n'utilise pas pthread_join et ne fournit pas de valeur de retour du thread. – Bluehorn