Windows 10 - Python - 线程 - 重定向重构方法

测试环境:

操作系统: Window 10
工具:Pycharm
Python: 3.7

近期在学习 Python 多线程多进程,发现了挺多有趣的东西,结合偶然间独自在测试中的奇妙发现,用一种自我命名的方法来命名这个发现,或者说是方法 —— 重定向重构方法,当然也不清楚是否有人已经发现这个有趣的方法,如果有谁知道的话,可以劳烦告知更多有关于这个方法的事情,非常感谢。

一、重名重参的方法

首先,要知道这个有趣的方法,先要知道在 Python 内,是可以实现多个函数重名重参的,假设两个重名重参的中间没有其他调用第一个函数的代码,而在第二个方法后,调用了第二个方法,那么解释器就会指向下一个函数,也就是说 第一个 函数名被解释器指向了第二个函数名的位置,调用函数名时,执行的是第二个函数体内的代码,而不是第一个函数的函数体内的代码,我把第二个方法称之为重定向重构方法
具体的看这个链接:
Python 居然可以定义 同名同参的函数 / 方法 - 惊奇的发现

好了,基本知识都知道了,下面是利用这个定向重构方法来调用同一个函数名。

代码演示:

def test(first):
    print("This is {}".format(first))
    
    
first = "AAA"
test(first)

def test(second):
    print("This is {}".format(second))
    
second = "BBB"
test(second)

运行结果:
在这里插入图片描述

二、多线程重定向重构的独立方法

还有一点是,如果在调用线程的时候,使用了这个方法,还挺有趣的。

import threading

# 定义后台子线程的线程执行体与普通线程没有任何区别
def action(max):
    for i in range(max):
        print("This is t thread: ",threading.current_thread().name + "  " + str(i))

        
# 指定创建的子线程的运行函数是 action,参数是元组 () 内容是 100 , 线程名为 后台线程
t = threading.Thread(target=action, args=(100,), name='后台线程')  

# 将此线程设置成后台子线程/后台线程
# 也可在创建Thread对象时通过daemon参数将其设为后台子线程/后台线程
t.setDaemon(True)

# 启动后台子线程/后台线程
t.start()  # 相当于是执行 action() 方法
print("t: ",t.daemon)
# 定义后台子线程的线程执行体与普通线程没有任何区别
def action(max):
    for i in range(max):
        print("This is t1 thread: ",threading.current_thread().name + "  " + str(i))

        
# 指定创建的子线程的运行函数是 action,参数是元组 () 内容是 100 , 线程名为 后台线程
t1 = threading.Thread(target=action, args=(100,), name='普通线程') 
t1.start()  # 相当于是执行 action() 方法
print("t1: ",t1.daemon)

for i in range(10):  # 运行到 10 则结束主线程
    print(threading.current_thread().name + "  " + str(i))
# -----程序执行到此处,前台线程(主线程)结束------
# 后台子线程/后台线程也应该随之结束

运行结果:
在这里插入图片描述
可以看到,两个重名重参的方法被独立出来了,不在是重定向第二个方法,而是将两个方法看做了独立的函数,互不影响。
当然要注意的是,要知道线程是共享变量的,然而这个变量共享指的是共用同一个函数内的变量,也就是说如果有多个线程调用了同一个函数,那么就有可能会产生线程冲突,第一个线程修改后的变量有可能被其他线程再次修改,导致该变量面目全非,谁也不知道这是啥东西,此时就会用到线程锁来锁定该函数,线程们就只能一个一个的等待线程锁的释放及获取线程锁。

三、总结

多线程使用重定向重构方法,会创造多个可独立运行的同名同参的函数,互不影响,这与多线程冲突不一样,多线程调用同一个函数 —— 线程共享,会导致同一个变量被多个线程修改 —— 线程冲突。

其实这个方法也没什么深奥的地方,只不过是重名重参这一点,引起了我的兴趣,再加上在学习多线程的时候,把我弄乱了点,就稍微研究下。
对于这个有趣的发现,大致就先研究到这里了,如果还有什么想要探讨的,可以留言。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值