Python线程中定位与销毁的详细介绍(附示例)

本篇文章给大家带来的内容是关于python线程中定位与销毁的详细介绍(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

开工前我就觉得有什么不太对劲,感觉要背锅。这可不,上班第三天就捅锅了。

我们有个了不起的后台程序,可以动态加载模块,并以线程方式运行,通过这种形式实现插件的功能。而模块更新时候,后台程序自身不会退出,只会将模块对应的线程关闭、更新代码再启动,6 得不行。

于是乎我就写了个模块准备大展身手,结果忘记写退出函数了,导致每次更新模块都新创建一个线程,除非重启那个程序,否则那些线程就一直苟活着。

这可不行啊,得想个办法清理呀,要不然怕是要炸了。

立即学习“Python免费学习笔记(深入)”;

那么怎么清理呢?我能想到的就是两步走:

找出需要清理的线程号 tid;

销毁它们;

找出线程ID

和平时的故障排查相似,先通过 ps 命令看看目标进程的线程情况,因为已经是 setName 设置过线程名,所以正常来说应该是看到对应的线程的。 直接用下面代码来模拟这个线程:

Python 版本的多线程

#coding: utf8import threadingimport osimport timedef tt():    info = threading.currentThread()    while True:        print 'pid: ', os.getpid()        print info.name, info.ident        time.sleep(3)t1 = threading.Thread(target=tt)t1.setName('OOOOOPPPPP')t1.setDaemon(True)t1.start()t2 = threading.Thread(target=tt)t2.setName('EEEEEEEEE')t2.setDaemon(True)t2.start()t1.join()t2.join()

登录后复制登录后复制

输出:

root@10-46-33-56:~# python t.pypid:  5613OOOOOPPPPP 139693508122368pid:  5613EEEEEEEEE 139693497632512...

登录后复制登录后复制

可以看到在 Python 里面输出的线程名就是我们设置的那样,然而 Ps 的结果却是令我怀疑人生:

root@10-46-33-56:~# ps -Tp 5613  PID  SPID TTY          TIME CMD 5613  5613 pts/2    00:00:00 python 5613  5614 pts/2    00:00:00 python 5613  5615 pts/2    00:00:00 python

登录后复制登录后复制

正常来说不该是这样呀,我有点迷了,难道我一直都是记错了?用别的语言版本的多线程来测试下:

C 版本的多线程

#include#include#include#includevoid *test(void *name){        pid_t pid, tid;    pid = getpid();    tid = syscall(__NR_gettid);    char *tname = (char *)name;        // 设置线程名字    prctl(PR_SET_NAME, tname);        while(1)    {        printf("pid: %d, thread_id: %u, t_name: %s", pid, tid, tname);        sleep(3);    }}int main(){    pthread_t t1, t2;    void *ret;    pthread_create(&t1, NULL, test,  (void *)"Love_test_1");    pthread_create(&t2, NULL, test,  (void *)"Love_test_2");    pthread_join(t1, &ret);    pthread_join(t2, &ret);}

登录后复制登录后复制

输出:

root@10-46-33-56:~# gcc t.c -lpthread && ./a.outpid: 5575, thread_id: 5577, t_name: Love_test_2pid: 5575, thread_id: 5576, t_name: Love_test_1pid: 5575, thread_id: 5577, t_name: Love_test_2pid: 5575, thread_id: 5576, t_name: Love_test_1...

登录后复制登录后复制

用 PS 命令再次验证:

root@10-46-33-56:~# ps -Tp 5575  PID  SPID TTY          TIME CMD 5575  5575 pts/2    00:00:00 a.out 5575  5576 pts/2    00:00:00 Love_test_1 5575  5577 pts/2    00:00:00 Love_test_2

登录后复制登录后复制

这个才是正确嘛,线程名确实是可以通过 Ps 看出来的嘛!

不过为啥 Python 那个看不到呢?既然是通过 setName 设置线程名的,那就看看定义咯:

[threading.py]class Thread(_Verbose):    ...    @property    def name(self):        """A string used for identification purposes only.        It has no semantics. Multiple threads may be given the same name. The        initial name is set by the constructor.        """        assert self.__initialized, "Thread.__init__() not called"        return self.__name    @name.setter    def name(self, name):        assert self.__initialized, "Thread.__init__() not called"        self.__name = str(name)            def setName(self, name):        self.name = name    ...

登录后复制登录后复制

看到这里其实只是在 Thread 对象的属性设置了而已,并没有动到根本,那肯定就是看不到咯~

这样看起来,我们已经没办法通过 ps 或者 /proc/ 这类手段在外部搜索 python 线程名了,所以我们只能在 Python 内部来解决。

于是问题就变成了,怎样在 Python 内部拿到所有正在运行的线程呢?

threading.enumerate  可以完美解决这个问题!Why?

Because 在下面这个函数的 doc 里面说得很清楚了,返回所有活跃的线程对象,不包括终止和未启动的。

[threading.py]def enumerate():    """Return a list of all Thread objects currently alive.    The list includes daemonic threads, dummy thread objects created by    current_thread(), and the main thread. It excludes terminated threads and    threads that have not yet been started.    """    with _active_limbo_lock:        return _active.values() + _limbo.values()

登录后复制登录后复制

因为拿到的是 Thread 的对象,所以我们通过这个能到该线程相关的信息!

请看完整代码示例:

#coding: utf8import threadingimport osimport timedef get_thread():    pid = os.getpid()    while True:        ts = threading.enumerate()        print '------- Running threads On Pid: %d -------' % pid        for t in ts:            print t.name, t.ident        print        time.sleep(1)        def tt():    info = threading.currentThread()    pid = os.getpid()    while True:        print 'pid: {}, tid: {}, tname: {}'.format(pid, info.name, info.ident)        time.sleep(3)        returnt1 = threading.Thread(target=tt)t1.setName('Thread-test1')t1.setDaemon(True)t1.start()t2 = threading.Thread(target=tt)t2.setName('Thread-test2')t2.setDaemon(True)t2.start()t3 = threading.Thread(target=get_thread)t3.setName('Checker')t3.setDaemon(True)t3.start()t1.join()t2.join()t3.join()

登录后复制登录后复制

输出:

root@10-46-33-56:~# python t_show.pypid: 6258, tid: Thread-test1, tname: 139907597162240pid: 6258, tid: Thread-test2, tname: 139907586672384------- Running threads On Pid: 6258 -------MainThread 139907616806656Thread-test1 139907597162240Checker 139907576182528Thread-test2 139907586672384------- Running threads On Pid: 6258 -------MainThread 139907616806656Thread-test1 139907597162240Checker 139907576182528Thread-test2 139907586672384------- Running threads On Pid: 6258 -------MainThread 139907616806656Thread-test1 139907597162240Checker 139907576182528Thread-test2 139907586672384------- Running threads On Pid: 6258 -------MainThread 139907616806656Checker 139907576182528...

登录后复制登录后复制

代码看起来有点长,但是逻辑相当简单,Thread-test1 和 Thread-test2 都是打印出当前的 pid、线程 id 和 线程名字,然后 3s 后退出,这个是想模拟线程正常退出。

而 Checker 线程则是每秒通过 threading.enumerate 输出当前进程内所有活跃的线程。

可以明显看到一开始是可以看到 Thread-test1 和 Thread-test2的信息,当它俩退出之后就只剩下 MainThread 和 Checker 自身而已了。

销毁指定线程

既然能拿到名字和线程 id,那我们也就能干掉指定的线程了!

假设现在 Thread-test2 已经黑化,发疯了,我们需要制止它,那我们就可以通过这种方式解决了:

在上面的代码基础上,增加和补上下列代码:

def _async_raise(tid, exctype):    """raises the exception, performs cleanup if needed"""    tid = ctypes.c_long(tid)    if not inspect.isclass(exctype):        exctype = type(exctype)    res = ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, ctypes.py_object(exctype))    if res == 0:        raise ValueError("invalid thread id")    elif res != 1:        ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, None)        raise SystemError("PyThreadState_SetAsyncExc failed")def stop_thread(thread):    _async_raise(thread.ident, SystemExit)def get_thread():    pid = os.getpid()    while True:        ts = threading.enumerate()        print '------- Running threads On Pid: %d -------' % pid        for t in ts:            print t.name, t.ident, t.is_alive()            if t.name == 'Thread-test2':                print 'I am go dying! Please take care of yourself and drink more hot water!'                stop_thread(t)        print        time.sleep(1)

登录后复制登录后复制

输出

root@10-46-33-56:~# python t_show.pypid: 6362, tid: 139901682108160, tname: Thread-test1pid: 6362, tid: 139901671618304, tname: Thread-test2------- Running threads On Pid: 6362 -------MainThread 139901706389248 TrueThread-test1 139901682108160 TrueChecker 139901661128448 TrueThread-test2 139901671618304 TrueThread-test2: I am go dying. Please take care of yourself and drink more hot water!------- Running threads On Pid: 6362 -------MainThread 139901706389248 TrueThread-test1 139901682108160 TrueChecker 139901661128448 TrueThread-test2 139901671618304 TrueThread-test2: I am go dying. Please take care of yourself and drink more hot water!pid: 6362, tid: 139901682108160, tname: Thread-test1------- Running threads On Pid: 6362 -------MainThread 139901706389248 TrueThread-test1 139901682108160 TrueChecker 139901661128448 True// Thread-test2 已经不在了

登录后复制登录后复制

一顿操作下来,虽然我们这样对待 Thread-test2,但它还是关心着我们:多喝热水

PS: 热水虽好,八杯足矣,请勿贪杯哦。

书回正传,上述的方法是极为粗暴的,为什么这么说呢?

因为它的原理是:利用 Python 内置的 API,触发指定线程的异常,让其可以自动退出;

clipboard.png

万不得已真不要用这种方法,有一定概率触发不可描述的问题。切记!别问我为什么会知道…

为什么停止线程这么难

多线程本身设计就是在进程下的协作并发,是调度的最小单元,线程间分食着进程的资源,所以会有许多锁机制和状态控制。

如果使用强制手段干掉线程,那么很大几率出现意想不到的bug。  而且最重要的锁资源释放可能也会出现意想不到问题。

我们甚至也无法通过信号杀死进程那样直接杀线程,因为 kill 只有对付进程才能达到我们的预期,而对付线程明显不可以,不管杀哪个线程,整个进程都会退出!

而因为有 GIL,使得很多童鞋都觉得 Python 的线程是Python 自行实现出来的,并非实际存在,Python 应该可以直接销毁吧?

然而事实上 Python 的线程都是货真价实的线程!

什么意思呢?Python 的线程是操作系统通过 pthread 创建的原生线程。Python  只是通过 GIL 来约束这些线程,来决定什么时候开始调度,比方说运行了多少个指令就交出 GIL,至于谁夺得花魁,得听操作系统的。

如果是单纯的线程,其实系统是有办法终止的,比如: pthread_exit,pthread_kill  或 pthread_cancel,  详情可看:https://www.cnblogs.com/Creat…

很可惜的是: Python 层面并没有这些方法的封装!我的天,好气!可能人家觉得,线程就该温柔对待吧。

如何温柔退出线程

想要温柔退出线程,其实差不多就是一句废话了~

要么运行完退出,要么设置标志位,时常检查标记位,该退出的就退出咯。

扩展

《如何正确的终止正在运行的子线程》:https://www.cnblogs.com/Creat…
《不要粗暴的销毁python线程》:http://xiaorui.cc/2017/02/22/…

欢迎各位大神指点交流, QQ讨论群: 258498217
转载请注明来源: https://segmentfault.com/a/11…

专栏

技术栈大杂烩

文章详情

                                                   3 天前发布                                                                                            

Python:线程之定位与销毁

c

linux

Python线程中定位与销毁的详细介绍(附示例)                                                                                                                      python

                                               266 次阅读                                                 ·                                                 读完需要 30 分钟                                                                                                                    

                           8                        

                                                                                                                                           

背景

开工前我就觉得有什么不太对劲,感觉要背锅。这可不,上班第三天就捅锅了。

我们有个了不起的后台程序,可以动态加载模块,并以线程方式运行,通过这种形式实现插件的功能。而模块更新时候,后台程序自身不会退出,只会将模块对应的线程关闭、更新代码再启动,6 得不行。

于是乎我就写了个模块准备大展身手,结果忘记写退出函数了,导致每次更新模块都新创建一个线程,除非重启那个程序,否则那些线程就一直苟活着。

这可不行啊,得想个办法清理呀,要不然怕是要炸了。

立即学习“Python免费学习笔记(深入)”;

那么怎么清理呢?我能想到的就是两步走:

找出需要清理的线程号 tid;

销毁它们;

找出线程ID

和平时的故障排查相似,先通过 ps 命令看看目标进程的线程情况,因为已经是 setName 设置过线程名,所以正常来说应该是看到对应的线程的。 直接用下面代码来模拟这个线程:

Python 版本的多线程

#coding: utf8import threadingimport osimport timedef tt():    info = threading.currentThread()    while True:        print 'pid: ', os.getpid()        print info.name, info.ident        time.sleep(3)t1 = threading.Thread(target=tt)t1.setName('OOOOOPPPPP')t1.setDaemon(True)t1.start()t2 = threading.Thread(target=tt)t2.setName('EEEEEEEEE')t2.setDaemon(True)t2.start()t1.join()t2.join()

登录后复制登录后复制

输出:

root@10-46-33-56:~# python t.pypid:  5613OOOOOPPPPP 139693508122368pid:  5613EEEEEEEEE 139693497632512...

登录后复制登录后复制

可以看到在 Python 里面输出的线程名就是我们设置的那样,然而 Ps 的结果却是令我怀疑人生:

root@10-46-33-56:~# ps -Tp 5613  PID  SPID TTY          TIME CMD 5613  5613 pts/2    00:00:00 python 5613  5614 pts/2    00:00:00 python 5613  5615 pts/2    00:00:00 python

登录后复制登录后复制

正常来说不该是这样呀,我有点迷了,难道我一直都是记错了?用别的语言版本的多线程来测试下:

C 版本的多线程

#include#include#include#includevoid *test(void *name){        pid_t pid, tid;    pid = getpid();    tid = syscall(__NR_gettid);    char *tname = (char *)name;        // 设置线程名字    prctl(PR_SET_NAME, tname);        while(1)    {        printf("pid: %d, thread_id: %u, t_name: %s", pid, tid, tname);        sleep(3);    }}int main(){    pthread_t t1, t2;    void *ret;    pthread_create(&t1, NULL, test,  (void *)"Love_test_1");    pthread_create(&t2, NULL, test,  (void *)"Love_test_2");    pthread_join(t1, &ret);    pthread_join(t2, &ret);}

登录后复制登录后复制

输出:

root@10-46-33-56:~# gcc t.c -lpthread && ./a.outpid: 5575, thread_id: 5577, t_name: Love_test_2pid: 5575, thread_id: 5576, t_name: Love_test_1pid: 5575, thread_id: 5577, t_name: Love_test_2pid: 5575, thread_id: 5576, t_name: Love_test_1...

登录后复制登录后复制

用 PS 命令再次验证:

root@10-46-33-56:~# ps -Tp 5575  PID  SPID TTY          TIME CMD 5575  5575 pts/2    00:00:00 a.out 5575  5576 pts/2    00:00:00 Love_test_1 5575  5577 pts/2    00:00:00 Love_test_2

登录后复制登录后复制

这个才是正确嘛,线程名确实是可以通过 Ps 看出来的嘛!

不过为啥 Python 那个看不到呢?既然是通过 setName 设置线程名的,那就看看定义咯:

[threading.py]class Thread(_Verbose):    ...    @property    def name(self):        """A string used for identification purposes only.        It has no semantics. Multiple threads may be given the same name. The        initial name is set by the constructor.        """        assert self.__initialized, "Thread.__init__() not called"        return self.__name    @name.setter    def name(self, name):        assert self.__initialized, "Thread.__init__() not called"        self.__name = str(name)            def setName(self, name):        self.name = name    ...

登录后复制登录后复制

看到这里其实只是在 Thread 对象的属性设置了而已,并没有动到根本,那肯定就是看不到咯~

这样看起来,我们已经没办法通过 ps 或者 /proc/ 这类手段在外部搜索 python 线程名了,所以我们只能在 Python 内部来解决。

于是问题就变成了,怎样在 Python 内部拿到所有正在运行的线程呢?

threading.enumerate  可以完美解决这个问题!Why?

Because 在下面这个函数的 doc 里面说得很清楚了,返回所有活跃的线程对象,不包括终止和未启动的。

[threading.py]def enumerate():    """Return a list of all Thread objects currently alive.    The list includes daemonic threads, dummy thread objects created by    current_thread(), and the main thread. It excludes terminated threads and    threads that have not yet been started.    """    with _active_limbo_lock:        return _active.values() + _limbo.values()

登录后复制登录后复制

因为拿到的是 Thread 的对象,所以我们通过这个能到该线程相关的信息!

请看完整代码示例:

#coding: utf8import threadingimport osimport timedef get_thread():    pid = os.getpid()    while True:        ts = threading.enumerate()        print '------- Running threads On Pid: %d -------' % pid        for t in ts:            print t.name, t.ident        print        time.sleep(1)        def tt():    info = threading.currentThread()    pid = os.getpid()    while True:        print 'pid: {}, tid: {}, tname: {}'.format(pid, info.name, info.ident)        time.sleep(3)        returnt1 = threading.Thread(target=tt)t1.setName('Thread-test1')t1.setDaemon(True)t1.start()t2 = threading.Thread(target=tt)t2.setName('Thread-test2')t2.setDaemon(True)t2.start()t3 = threading.Thread(target=get_thread)t3.setName('Checker')t3.setDaemon(True)t3.start()t1.join()t2.join()t3.join()

登录后复制登录后复制

输出:

root@10-46-33-56:~# python t_show.pypid: 6258, tid: Thread-test1, tname: 139907597162240pid: 6258, tid: Thread-test2, tname: 139907586672384------- Running threads On Pid: 6258 -------MainThread 139907616806656Thread-test1 139907597162240Checker 139907576182528Thread-test2 139907586672384------- Running threads On Pid: 6258 -------MainThread 139907616806656Thread-test1 139907597162240Checker 139907576182528Thread-test2 139907586672384------- Running threads On Pid: 6258 -------MainThread 139907616806656Thread-test1 139907597162240Checker 139907576182528Thread-test2 139907586672384------- Running threads On Pid: 6258 -------MainThread 139907616806656Checker 139907576182528...

登录后复制登录后复制

代码看起来有点长,但是逻辑相当简单,Thread-test1 和 Thread-test2 都是打印出当前的 pid、线程 id 和 线程名字,然后 3s 后退出,这个是想模拟线程正常退出。

而 Checker 线程则是每秒通过 threading.enumerate 输出当前进程内所有活跃的线程。

可以明显看到一开始是可以看到 Thread-test1 和 Thread-test2的信息,当它俩退出之后就只剩下 MainThread 和 Checker 自身而已了。

销毁指定线程

既然能拿到名字和线程 id,那我们也就能干掉指定的线程了!

假设现在 Thread-test2 已经黑化,发疯了,我们需要制止它,那我们就可以通过这种方式解决了:

在上面的代码基础上,增加和补上下列代码:

def _async_raise(tid, exctype):    """raises the exception, performs cleanup if needed"""    tid = ctypes.c_long(tid)    if not inspect.isclass(exctype):        exctype = type(exctype)    res = ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, ctypes.py_object(exctype))    if res == 0:        raise ValueError("invalid thread id")    elif res != 1:        ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, None)        raise SystemError("PyThreadState_SetAsyncExc failed")def stop_thread(thread):    _async_raise(thread.ident, SystemExit)def get_thread():    pid = os.getpid()    while True:        ts = threading.enumerate()        print '------- Running threads On Pid: %d -------' % pid        for t in ts:            print t.name, t.ident, t.is_alive()            if t.name == 'Thread-test2':                print 'I am go dying! Please take care of yourself and drink more hot water!'                stop_thread(t)        print        time.sleep(1)

登录后复制登录后复制

输出

root@10-46-33-56:~# python t_show.pypid: 6362, tid: 139901682108160, tname: Thread-test1pid: 6362, tid: 139901671618304, tname: Thread-test2------- Running threads On Pid: 6362 -------MainThread 139901706389248 TrueThread-test1 139901682108160 TrueChecker 139901661128448 TrueThread-test2 139901671618304 TrueThread-test2: I am go dying. Please take care of yourself and drink more hot water!------- Running threads On Pid: 6362 -------MainThread 139901706389248 TrueThread-test1 139901682108160 TrueChecker 139901661128448 TrueThread-test2 139901671618304 TrueThread-test2: I am go dying. Please take care of yourself and drink more hot water!pid: 6362, tid: 139901682108160, tname: Thread-test1------- Running threads On Pid: 6362 -------MainThread 139901706389248 TrueThread-test1 139901682108160 TrueChecker 139901661128448 True// Thread-test2 已经不在了

登录后复制登录后复制

一顿操作下来,虽然我们这样对待 Thread-test2,但它还是关心着我们:多喝热水

PS: 热水虽好,八杯足矣,请勿贪杯哦。

书回正传,上述的方法是极为粗暴的,为什么这么说呢?

因为它的原理是:利用 Python 内置的 API,触发指定线程的异常,让其可以自动退出;

clipboard.png

万不得已真不要用这种方法,有一定概率触发不可描述的问题。切记!别问我为什么会知道…

为什么停止线程这么难

多线程本身设计就是在进程下的协作并发,是调度的最小单元,线程间分食着进程的资源,所以会有许多锁机制和状态控制。

如果使用强制手段干掉线程,那么很大几率出现意想不到的bug。  而且最重要的锁资源释放可能也会出现意想不到问题。

我们甚至也无法通过信号杀死进程那样直接杀线程,因为 kill 只有对付进程才能达到我们的预期,而对付线程明显不可以,不管杀哪个线程,整个进程都会退出!

而因为有 GIL,使得很多童鞋都觉得 Python 的线程是Python 自行实现出来的,并非实际存在,Python 应该可以直接销毁吧?

然而事实上 Python 的线程都是货真价实的线程!

什么意思呢?Python 的线程是操作系统通过 pthread 创建的原生线程。Python  只是通过 GIL 来约束这些线程,来决定什么时候开始调度,比方说运行了多少个指令就交出 GIL,至于谁夺得花魁,得听操作系统的。

如果是单纯的线程,其实系统是有办法终止的,比如: pthread_exit,pthread_kill  或 pthread_cancel,  详情可看:https://www.cnblogs.com/Creat…

很可惜的是: Python 层面并没有这些方法的封装!我的天,好气!可能人家觉得,线程就该温柔对待吧。

如何温柔退出线程

想要温柔退出线程,其实差不多就是一句废话了~

要么运行完退出,要么设置标志位,时常检查标记位,该退出的就退出咯。

扩展

《如何正确的终止正在运行的子线程》:https://www.cnblogs.com/Creat…
《不要粗暴的销毁python线程》:http://xiaorui.cc/2017/02/22/…

欢迎各位大神指点交流, QQ讨论群: 258498217
转载请注明来源: https://segmentfault.com/a/11…

保留所有权利

举报

如果觉得我的文章对你有用,请随意赞赏

你可能感兴趣的

2 条评论                                                    

默认排序                        时间排序

Python线程中定位与销毁的详细介绍(附示例)            

                                           

舞林                                          ·  1 天前                

如果是我可能kill -9了,宁可错杀一千,不可放过一个,蛤蛤

                                               赞                                                                                    回复                                                          

                                                                                                           0                                                                                                                                                                

不行呀~ -9 进程里全死了~

                                                                                                                                                                                                                                                                                                                                                                    —                                                                                    Lin_R                                                                                                                            作者                                                                                  ·  1 天前                                                                                                            

添加回复

载入中…

显示更多评论

Python线程中定位与销毁的详细介绍(附示例)

以上就是Python线程中定位与销毁的详细介绍(附示例)的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2533989.html

(0)
上一篇 2025年3月5日 21:24:08
下一篇 2025年2月18日 16:02:24

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 苹果电脑终端密码是什么密码?

    苹果电脑终端密码通常指管理员密码,用于对系统进行高级操作。如果您忘记或无法访问该密码,将严重影响您对系统的控制。php小编新一为大家带来解决苹果电脑终端密码丢失的详细指南,带您一步步找回密码,重新掌控系统。 一、苹果电脑终端密码是什么密码?…

    2025年3月5日
    200
  • win10未激活如何创建我的电脑图标?

    很多用户不知道win10未激活如何创建我的电脑图标,php小编草莓就来为大家解决这个问题,php小编草莓接下来就会给大家带来win10未激活创建我的电脑图标详细内容,希望对大家有所帮助哦! 一、win10未激活如何创建我的电脑图标? 1、在…

    2025年3月5日
    200
  • 怎么找到黑客的联系方式?

    如果你想要找到黑客的联系方式,那么你可能面临以下难题:黑客往往会隐藏他们的身份,并且他们的联系方式很难被发现。php小编草莓在这里为你提供了一份指南,旨在帮助你找到黑客的联系方式。在本指南中,我们将介绍一些常见的黑客使用的联系方式,并提供一…

    2025年3月5日
    200
  • 如何查看电脑配置硬件型号 | 电脑硬件型号查询方法

    想知道你的电脑硬件型号,却不知道从何入手?php小编鱼仔贴心整理了一份全面的电脑硬件型号查询指南,帮助你了解每种硬件的具体型号。从cpu、内存到显卡、主板,我们逐一讲解,让你轻松掌握电脑硬件信息。继续阅读下文,获取详细的查询方法和技巧,让你…

    2025年3月5日
    200
  • 手提电脑耗电量多大?

    手提电脑耗电量大小取决于多种因素,包括屏幕大小、处理器类型和使用方式。想知道更多关于手提电脑耗电量的信息,以及如何优化其使用方式,请继续阅读下文。 一、手提电脑耗电量多大? 40-70w的范围。 一.每个笔记本的功率都不同, 一般都在60W…

    2025年3月5日
    200
  • 查看电脑网卡型号怎样查看电脑网卡型号?

    如何轻松获取电脑网卡型号?php小编新一为大家带来查看电脑网卡型号的详细教程。对于网络工程师或普通用户而言,识别网卡型号对于诊断网络问题或升级设备至关重要。本文将逐步指导您通过各种方法获取网卡型号,包括命令行、系统设置和第三方工具。继续阅读…

    2025年3月5日
    200
  • chrome如何导出密码和账号?

    你知道如何从 chrome 中导出密码和账号吗?chrome浏览器提供了便捷的功能,允许用户轻松地导出和备份他们的密码和账号信息。如果你遇到需要在不同设备或浏览器之间迁移密码的情况,或者出于安全考虑想要备份你的登录信息,那么这个教程将为你提…

    2025年3月5日
    200
  • 守望先锋 电脑 壁纸

    喜爱守望先锋的玩家们,是否正在寻找精美的电脑壁纸来装点桌面?php小编鱼仔为大家收集了大量高品质的守望先锋电脑壁纸,覆盖各个英雄、地图和场景。这些壁纸色彩鲜艳,细节丰富,能够让你的电脑桌面焕然一新。为了方便大家挑选,我们按英雄、地图、场景等…

    2025年3月5日
    200
  • 如何连接蓝牙手柄到电脑上

    无法连接蓝牙手柄到电脑可能让您感到无奈。php小编子墨了解您的需求,为您带来了一篇深入的指南,介绍如何轻松解决此问题。本文将详细介绍将蓝牙手柄连接到电脑的各种方法,包括配对、疑难解答和优化连接性能。无论您是游戏玩家还是需要使用蓝牙手柄与其他…

    2025年3月5日
    200
  • U盘装系统:教你如何用U盘组装电脑

    想要用u盘组装电脑,却苦于不知如何操作?别担心,php小编百草倾情奉上教程,一步步教你如何利用u盘,打造出属于你自己的个性化电脑。从u盘的制作到系统安装,这篇指南将细致入微地为你解答所有疑问。快来加入我们,开启u盘组装电脑的奇妙之旅! 一、…

    2025年3月5日
    200

发表回复

登录后才能评论