2013-01-05 78 views
3

晚上好,大家。我正在使用Python 2.7和線程模塊編寫多線程程序。下面是一個代碼示例:Python pthread_detach模擬

# 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() 

我知道在C++(POSIX線程庫)有一個pthread_detach()功能這使一個正在運行的線程在分離狀態。它保證了這個線程在函數結束後將資源釋放回系統。那麼,Python中是否有這樣的函數的模擬?或者,也許,根本不需要在Python中分離線程,線程採用的資源將在線程函數結束後自動釋放?

我試圖搜索關於docs.python.org和Google的信息,但它毫無結果。

回答

1

Goog morning,everyone。其實答案是'不需要在Python中分離線程'。這個答案是由GaiveR同志從there給我的。你所需要的只是尋找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

它並不那麼簡單。您確定代碼實際上是由解釋器使用的嗎(請參見['Python/thread.c']頂部的註釋(http://hg.python.org/cpython/file/8a6068ec220e/Python/thread.c# l2)(使用'thread_pthread.h'的唯一地方))?據我所知,'pthread_detach()'使線程不可連接,但使用'threading.Thread()* *創建的線程*是可連接的。 – jfs

+0

@ jf-sebastian你在這裏比較蘋果和oranges:''pthread_detach''使底層系統線程不可連接,與''threading.Thread''的連接方法無關,所以你不能斷定pthread_detach不叫。事實上,Python最好在Unix上使用pthreads(它在Linux上),並且在Python 2.7源文件中唯一的對「pthread_create」的調用是在該函數中,所以答案是正確的。 [加入Python](https://hg.python.org/cpython/file/v2.7.10/Lib/threading.py#l911)不使用pthread_join,也不提供線程的返回值。 – Bluehorn