print(“子线程运行秒数:”,‘%d’ % (self.i))
time.sleep(1)
print(“子线程运行结束!”)
if name == ‘main’:
ta = mythread() # 实例化线程
ta.start() # 开启ta线程
ta.join() # 主线程等待 ta线程结束才继续执行
print(“主线程结束!”)
代码运行效果:
4、线程的同步——锁 当一个进程拥有多个线程之后,如果他们各做各的任务互没有关系还行,但既然属于同一个进程,他们之间总是具有一定关系的。比如多个线程都要对某个数据进行修改,则可能会出现不可预料的结果。为保证操作正确,就需要引入锁来进行线程间的同步。 Python3 中的 threading 模块提供了 RLock 锁(可重入锁):
-
对于某一时间只能让一个线程操作的语句放到 RLock 的 acquire 方法 和 release 方法之间;
-
即 acquire() 函数相当于给 RLock 锁 上锁,而 release() 函数相当于解锁。
来看看一个简单的演示案例:
import threading
class mythread(threading.Thread):
def run(self):
global x # 声明一个全局变量
lock.acquire() # 上锁,acquire()和release()之间的语句一次只能有一个线程进入,其余线程在acquire()处等待
x += 10
print(‘%s:%d’ % (self.name, x))
lock.release() # 解锁
x = 0
lock = threading.RLock() # 创建 可重入锁
def main():
l = []
for i in range(5):
l.append(mythread()) # 创建5个线程,并把他们放到一个列表中
for i in l:
i.start() # 开启列表中的所有线程
if name == ‘main’:
main()
代码运行效果:
5、多线程函数小结:
t = Thread(target=func)
启动子线程
t.start()
阻塞子线程,待子线程结束后,再往下执行
t.join()
判断线程是否在执行状态,在执行返回True,否则返回False
t.is_alive()
t.isAlive()
设置线程是否随主线程退出而退出,默认为False
t.daemon = True
t.daemon = False
设置线程名
t.name = “My-Thread”
Python脚本 下面将从单线程、多线程两种角度实现 ZIP 加密文件的密码爆破。 单线程数字爆破 先来生成一个用数字密码(“101”)加密的 ZIP 压缩文件 password.zip,压缩文件为图片 pasword.png(注意勾选 “ZIP 传统加密” 的选项,后面的代码不支持 WinRAR 新式的默认加密方式),如下图所示:
爆破密码的脚本也相对简单,直接上代码:
import zipfile
import os
import time
import sys
“”"
获取zip文件
“”"
def get_zipfile():
os.chdir(r’D:\Code\Python\MyTest\Basic’)
files = os.listdir()
for file in files:
if file.endswith(‘.zip’):
return file
“”"
爆破zip文件
“”"
def extract():
file = get_zipfile()
zfile = zipfile.ZipFile(file) # 读取压缩文件
start_time = time.time()
for num in range(1, 99999): # 设置爆破的数字密码区间
try:
zfile.extractall(path=‘.’, pwd=str(num).encode(‘utf-8’))
print(‘解压密码是:’, str(num))
end_time = time.time()
print(‘单线程破解压缩包花了%s秒’ % (end_time - start_time))
sys.exit(0) # 让程序在得到结果后,就停止运行,正常退出
except Exception as e:
print(e)
#pass
if name == “main”:
extract()
爆破密码的脚本也相对简单,直接上代码:
import zipfile
import os
import time
import sys
“”"
获取zip文件
“”"
def get_zipfile():
os.chdir(r’D:\Code\Python\MyTest\Basic’)
files = os.listdir()
for file in files:
if file.endswith(‘.zip’):
return file
“”"
爆破zip文件
“”"
def extract():
file = get_zipfile()
zfile = zipfile.ZipFile(file) # 读取压缩文件
start_time = time.time()
for num in range(1, 99999): # 设置爆破的数字密码区间
try:
zfile.extractall(path=‘.’, pwd=str(num).encode(‘utf-8’))
print(‘解压密码是:’, str(num))
end_time = time.time()
print(‘单线程破解压缩包花了%s秒’ % (end_time - start_time))
sys.exit(0) # 让程序在得到结果后,就停止运行,正常退出
except Exception as e:
print(e)
#pass
if name == “main”:
extract()
以上代码没什么需要特别解释的,简单补充两点:
- 需要注意的是在爆破过程需要使用异常处理机制避免密码错误时程序直接终止;
下面直接来看看 Pycharm 中运行脚本的效果:
单线程字符爆破
先来看看脚本:
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Python开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注Python)
(1)Python所有方向的学习路线(新版)
这是我花了几天的时间去把Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
最近我才对这些路线做了一下新的更新,知识体系更全面了。
(2)Python学习视频
包含了Python入门、爬虫、数据分析和web开发的学习视频,总共100多个,虽然没有那么全面,但是对于入门来说是没问题的,学完这些之后,你可以按照我上面的学习路线去网上找其他的知识资源进行进阶。
(3)100多个练手项目
我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了,只是里面的项目比较多,水平也是参差不齐,大家可以挑自己能做的项目去练练。
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
b197de0dc0438ec5.png#pic_center)
(3)100多个练手项目
我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了,只是里面的项目比较多,水平也是参差不齐,大家可以挑自己能做的项目去练练。
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-ZUjDajQO-1712479871813)]