目录
- 一、重名重参的方法
- 二、多线程重定向重构的独立方法
- 三、总结
测试环境:
操作系统: 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))
# -----程序执行到此处,前台线程(主线程)结束------
# 后台子线程/后台线程也应该随之结束
运行结果:
可以看到,两个重名重参的方法被独立出来了,不在是重定向第二个方法,而是将两个方法看做了独立的函数,互不影响。
当然要注意的是,要知道线程是共享变量的,然而这个变量共享指的是共用同一个函数内的变量,也就是说如果有多个线程调用了同一个函数,那么就有可能会产生线程冲突,第一个线程修改后的变量有可能被其他线程再次修改,导致该变量面目全非,谁也不知道这是啥东西,此时就会用到线程锁来锁定该函数,线程们就只能一个一个的等待线程锁的释放及获取线程锁。
三、总结
多线程使用重定向重构方法,会创造多个可独立运行的同名同参的函数,互不影响,这与多线程冲突不一样,多线程调用同一个函数 —— 线程共享,会导致同一个变量被多个线程修改 —— 线程冲突。
其实这个方法也没什么深奥的地方,只不过是重名重参这一点,引起了我的兴趣,再加上在学习多线程的时候,把我弄乱了点,就稍微研究下。
对于这个有趣的发现,大致就先研究到这里了,如果还有什么想要探讨的,可以留言。