博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python 中获取线程id
阅读量:4221 次
发布时间:2019-05-26

本文共 5652 字,大约阅读时间需要 18 分钟。

该问题的解决主要参考了网上的几篇文章,在此一并谢过。

1、python下使用ctypes获取threading线程id

python的多线程坑坑不断… …

python的threading因为封装的太好, 很多本源的东西在threading对象里是拿不到的.  首先需要说明的是python threading的name跟ident,这些看起来是线程名字,线程id其实只是个标识,注意是标识而已.  简单过了下threading创建对象及启动线程的代码,发现ident跟pstree查到的线程id是两码事. 

该文章写的有些乱,欢迎来喷 ! 另外文章后续不断更新中,请到原文地址查看更新

我在 stackoverflow 查询到了一些关于pyhton线程id的获取方式,但大多数人其实对线程id是不关心的,他们会利用threading给予的threading.currentThread().ident threading.currentThread().name来识别线程.  最后在查到一老外写的使用ctypes调用系统的动态链接库libc.so.6 来获取线程id的方法, 当然事实证明是有效果的. 

老外的连接 

ctypes是Python的一个外部库,提供和C语言兼容的数据类型,可以很方便地调用C DLL中的函数. 我对这个ctypes理解也不深入,在以前的项目中用过,表示有些粗暴.

废话不多说, 直接上python ctypes样例,关于这186,224,178不知道啥意思.

下面是python threading获取线程id的实例代码:

这是上面py代码运行后的结果,  跟我们预期的效果一致.

可以另起一个终端使用pstree -p pid看看是否正确.  

那么我们费尽心思取到python的线程id是为了什么?  strace -p pid/线程 的状态.  可以看到24831线程正在建立google.com的连接, 很明显这连接被拒了.

END.  下次有时间在专门瞅瞅python ctypes的用法. 

对Python及运维开发感兴趣的朋友可以加QQ群 : 478476595 !!! 
{ 2000人qq大群内有各厂大牛,常组织线上分享及沙龙,对高性能及分布式场景感兴趣同学欢迎加入该QQ群 } 
另外如果大家觉得文章对你有些作用!   帮忙点击广告. 一来能刺激我写博客的欲望,二来好维护云主机的费用. 
如果想赏钱,可以用微信扫描下面的二维码. 另外再次标注博客原地址    ……   感谢!

其中提到的老外的文章:

So I've got a multi-threaded application and suddenly I notice there's one thread running away and using all CPU. Not good, probably a loop gone wrong. But where? One way to find this is revert history in the VCS and keep trying it out till you find the bad commit. Another way is to find out which thread is doing this, this is of course much more fun!

Using ps -p PID -f -L you'll see the thread ID which is causing the problems. To relate this to a Python thread I subclass threading.Thread, override it's .start() method to first wrap the .run() method so that you can log the thread ID before calling the original .run(). Since I was already doing all of this apart from the logging of the thread ID this was less work then it sounds. But the hard part is finding the thread ID.

Python knows of a  method but this is merely a long unique integer and does not correspond to the actual thread ID of the OS. The kernel allows you to get the thread ID: getid(2). But this must be called using a system call with the constant name SYS_gettid. Because it's hard to use constants in ctypes (at least I don't know how to do this), and this is not portable anyway, I used this trivial C program to find out the constant value:

#include 
#include
int main(void){ printf("%d\n", SYS_gettid); return 0;}

In my case the constant to use is 186. Now all that is left is using  to do the system call:

import ctypesSYS_gettid = 186libc = ctypes.cdll.LoadLibrary('libc.so.6')tid = libc.syscall(SYS_gettid)

That's it! Now you have the matching thread ID!

Going back to the original problem you can now associate this thread ID with the thread name and you should be able to find the problematic thread.

对于‘libc.so.6'的使用可以是直接调用或是先载入(Loadlibrary)都行。

2、采用ubuntu系统时可能会碰到libc.so.6位置的问题,即无法导入模块,或无法找到该动态库时解决方法:

在Ubuntu 14.04LTS用命令:/lib/libc.so.6时,提示” /lib/libc.so.6: not found“,其实这个库是存在的,只是地方换了,在"/lib/i386-linux-gnu/"下面,我们只需创建一个链接即可。

使用下面的命令:

For 64 bit:

sudo ln -s /lib64/x86_64-linux-gnu/libc-2.13.so /lib64/libc.so.6

For 32 bit:

sudo ln -s /lib/i386-linux-gnu/libc-2.13.so /lib/libc.so.6

http://xiaorui.cc/2016/03/21/python%E4%B8%8B%E4%BD%BF%E7%94%A8ctypes%E8%8E%B7%E5%8F%96threading%E7%BA%BF%E7%A8%8Bid/

http://blog.51cto.com/happyliu/1731402

转载地址:http://gvemi.baihongyu.com/

你可能感兴趣的文章
光流法(Optical Flow)
查看>>
基于CUDA的硬编解码
查看>>
OpenCV中GPU模块(CUDA)函数
查看>>
vs2010如何引用相对路径
查看>>
存取像素值操作
查看>>
Opencv调用GPU模块
查看>>
opencv读取视频文件并显示的程序详细解释
查看>>
智能视频分析
查看>>
使用opencv进行多路视频的播放
查看>>
L-K光流法
查看>>
virtual详解
查看>>
c++ virtual总结
查看>>
CUDA5.5+Opencv2.4.9+VS2010+Win7 64bit
查看>>
Opencv批量读取文件夹图片
查看>>
基于opencv读取两个摄像头信息
查看>>
解码图像保存单帧
查看>>
解码保存全部BMP图像
查看>>
NV12转化为BMP函数
查看>>
双目运算符重载
查看>>
Opencv同时读入多个视频
查看>>