Python pthread_detach 模拟

Posted

技术标签:

【中文标题】Python pthread_detach 模拟【英文标题】:Python pthread_detach analog 【发布时间】:2013-01-05 18:38:12 【问题描述】:

大家晚上好。我正在使用 Python 2.7 和 threading 模块编写多线程程序。这是一个代码示例:

# 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和谷歌的信息,但没有结果。

【问题讨论】:

【参考方案1】:

大家早上好。实际上答案是'根本不需要在 Python 中分离线程'。这个答案是there的GaiveR同志给我的。您只需要查看 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);
...

【讨论】:

没那么简单。您确定解释器实际使用了代码(参见Python/thread.c 顶部的注释(唯一使用thread_pthread.h 的地方))?据我了解pthread_detach() 使线程无法连接,但使用threading.Thread() 创建的线程 可连接。 @j-f-sebastian 你这里是苹果和橘子对比:pthread_detach 使得底层系统线程不可连接,和threading.Thread 的join 方法无关,所以不能下结论不调用 pthread_detach。事实上,Python 最好在可用的 Unix 上使用 pthreads(它在 Linux 上),并且在 Python 2.7 源代码中对 pthread_create 的唯一调用是在该函数中,所以答案是正确的。 Join in Python 不使用 pthread_join 也不提供线程的返回值。

以上是关于Python pthread_detach 模拟的主要内容,如果未能解决你的问题,请参考以下文章

pthread_detach 上的错误文件描述符

如果在已经返回的线程上调用pthread_detach会发生什么

存在现有连接器时的 pthread_detach 行为

pthread_detach()与pthread_join的区别?

linux下多线程之pthread_detach(pthread_self())

为啥在 pthread_detach() 之后调用 pthread_exit() 在极少数情况下会导致 SEGV?