资讯

精准传达 • 有效沟通

从品牌网站建设到网络营销策划,从策略到执行的一站式服务

python函数销毁 python销毁线程

python线程怎么销毁

【Python】线程的创建、执行、互斥、同步、销毁

创新互联公司主营集安网站建设的网络公司,主营网站建设方案,APP应用开发,集安h5成都小程序开发搭建,集安网站营销推广欢迎集安等地区企业咨询

还是《【Java】利用synchronized(this)完成线程的临界区》(点击打开链接)、《【Linux】线程互斥》(点击打开链接)、《【C++】Windows线程的创建、执行、互斥、同步、销毁》(点击打开链接)中的设置多个线程对一个ticket进行自减操作,用来说明Python中多线程的运用,涉及的创建、执行、互斥、同步、销毁问题。

运行结果如下,还是差不多,运行三次,每次的运行结果,每个线程最终的得票结果是不同的,但是4个线程最终“得票”的总和为 ticket 最初设置的值为100000,证明这4个线程成功实现了互斥。

虽然每次运行结果是不同,但是可以看得出每次运行结果大抵上是平均的。貌似Python对线程作系统资源的处理,比Java要好。

然而,Python总要实现多线程,代码并不像想象中简单,具体如下:

[python] view plain copy print?在CODE上查看代码片派生到我的代码片

# -*-coding:utf-8-*-

import threading;

mutex_lock = threading.RLock(); # 互斥锁的声明

ticket = 100000; # 总票数

# 用于统计各个线程的得票数

ticket_for_thread1 = 0;

ticket_for_thread2 = 0;

ticket_for_thread3 = 0;

ticket_for_thread4 = 0;

class myThread(threading.Thread): # 线程处理函数

def __init__(self, name):

threading.Thread.__init__(self); # 线程类必须的初始化

self.thread_name = name; # 将传递过来的name构造到类中的name

def run(self):

# 声明在类中使用全局变量

global mutex_lock;

global ticket;

global ticket_for_thread1;

global ticket_for_thread2;

global ticket_for_thread3;

global ticket_for_thread4;

while 1:

mutex_lock.acquire(); # 临界区开始,互斥的开始

# 仅能有一个线程↓↓↓↓↓↓↓↓↓↓↓↓

if ticket 0:

ticket -= 1;

# 统计哪到线程拿到票

print "%s抢到了票!票还剩余:%d。" % (self.thread_name, ticket);

if self.thread_name == "线程1":

ticket_for_thread1 += 1;

elif self.thread_name == "线程2":

ticket_for_thread2 += 1;

elif self.thread_name == "线程3":

ticket_for_thread3 += 1;

elif self.thread_name == "线程4":

ticket_for_thread4 += 1;

else:

break;

# 仅能有一个线程↑↑↑↑↑↑↑↑↑↑↑↑

mutex_lock.release(); # 临界区结束,互斥的结束

mutex_lock.release(); # python在线程死亡的时候,不会清理已存在在线程函数的互斥锁,必须程序猿自己主动清理

print "%s被销毁了!" % (self.thread_name);

# 初始化线程

thread1 = myThread("线程1");

thread2 = myThread("线程2");

thread3 = myThread("线程3");

thread4 = myThread("线程4");

# 开启线程

thread1.start();

thread2.start();

thread3.start();

thread4.start();

# 等到线程1、2、3、4结束才进行以下的代码(同步)

thread1.join();

thread2.join();

thread3.join();

thread4.join();

print "票都抢光了,大家都散了吧!";

print "=========得票统计=========";

print "线程1:%d张" % (ticket_for_thread1);

print "线程2:%d张" % (ticket_for_thread2);

print "线程3:%d张" % (ticket_for_thread3);

print "线程4:%d张" % (ticket_for_thread4);

1、从上面的代码可以看出,在Python2.7中要使用线程必须使用threading而不是古老的thread模块。

如果你像网上部分遗留依旧的文章一样,在Python2.7中使用thread来实现线程,至少在Eclipse的Pydev中会报错:sys.excepthook is missing,lost sys.stderr如下图所示:

所以必须使用现时Python建议使用的threading。

2、与其它编程语言类似,声明一个互斥锁,与一系列的得票数。之后,与Java同样地,Python实现线程的函数,是要重写一个类。而类中使用全局变量,则与同为脚本语言的PHP一样《【php】global的使用与php的全局变量》(点击打开链接),要用global才能使用这个全局变量,而不是C/C++可以直接使用。

3、需要注意的,Python需要在线程跑完class myThread(threading.Thread)这个类的def run(self)方法之前,必须自己手动清理互斥锁,它不会像其它编程语言那样,说线程跑完def run(self)方法,会自然而然地清理该线程被创建的互斥锁。如果没有最后一句手动清理互斥锁,则会造成死锁。

4、最后与其它编程语言一样了,利用线程的join方法可以等待这个线程跑完def run(self)方法中的所有代码,才执行之后的代码,实现同步。否则主函数中的代码,相当于与父线程。主函数开启的线程,相当于其子线程,互不影响的。

请问我的python函数为什么要加return才能正常输出?

因为name这个变量的作用域只在 make_great这个函数的范围内。而不在tt所在的大的函数范围内。一旦make_great这个函数结束了,name这个变量就会被销毁而传递不出makegreat这个函数。这是为什么第一种情况你得到了none。

因此需要使用return对你想在makegreat函数局部变量被销毁之后继续使用的变量的值进行拷贝,有点绕666。保存拷贝下来的值不被销毁,而赋给tt使用。这是为什么要使用return。

Python析构函数

Python中有两个特殊的方法, 一个是构造函数 init , 另一个是析构函数 del ,统称为魔术方法。

构造函数 init ,创建实例对象之后Python会自动执行此方法,把初始化的属性特点放到实例对象里。

构造函数是创建并初始对象属性,那么对象使用完成后,系统是怎么处理这些呢?

这个时候,Python引入了销毁对象功能的析构函数 del ()

析构函数 del 是对象没有被引用时会触发垃圾回收机制,进行内存释放.

python 内置的 del 方法称为析构方法。用于实现对象被销毁时所需的操作。

常见的应用常见如:

析构方法 del ()是可选的,如果不提供,则Python 会在后台提供默认析构函数

如果要显式的调用析构函数,可以使用del关键字: del obj

析构方法的作用是销毁对象的,在python中采用垃圾回收机制。

Python垃圾回收机制核心思想是:

详细说明:

我们主动删除对象调用del 对象;程序运行结束后,python也会自动进行删除其他的对象。

注意:

如果我们重写子类的 del () 方法(父类为非 object 的类),则必须显式调用父类的 del () 方法,这样才能保证在回收子类对象时,其占用的资源(可能包含继承自父类的部分资源)能被彻底释放

我们本期学习了Python内置函数析构函数,用于没有被引用的对象进行回收处理,一般情况下,我们不用刻意去调用,python内部会对进行触发。

以上是本期内容,欢迎大佬们评论区指正,下期见~

python函数调用后的变量在return后会不会销毁

python函数调用后的变量不会销毁,除非程序执行完毕,或者手动进行销毁。


当前题目:python函数销毁 python销毁线程
网站URL:http://www.cdkjz.cn/article/doshsod.html
多年建站经验

多一份参考,总有益处

联系快上网,免费获得专属《策划方案》及报价

咨询相关问题或预约面谈,可以通过以下方式与我们联系

大客户专线   成都:13518219792   座机:028-86922220