Python多线程的简单介绍和使用
多线程和多进程的效果是不一样的。
一,多线程 是用来提高io的利用率的,也就是你的程序需要频繁的进行io操作比如如制作密码字典。它并不能提高程序的计算速率,在没有使用多进程的情况下 即使你开启1000个线程它门也只能共用一个cpu核心,比如你的cpu是4核8线程的 ,那么这1000个线程加起来也只能占用cpu的4分之一也就是25%。
python中多线程模块叫 threading 通常使用的是threading中的Thread 你可以通过类的继承来创建自己的多线程。
常见参数: Thread(target , daemon=False , args =[]) target:目标函数,我自己通常使用lambda表达式,方便传参 args:传参列表,可以是列表,字典,元组,等可迭代的数据类型,个数要与目标函数形式参数数量一致 daemon:是否跟随主进程默认值False,True:主进程执行完成后,子线程自动退出 ; False:主进程执行完成后,子线程仍然可以存活,主进程等待所有线程完成后才退出。 代码实现:
'''
Author:歧路学士
Date:2021年12月2日18:16:59
'''
import time
from threading import Thread
def task1():
print('task1 start!')
while True:
print('task1')
time.sleep(1)
def task2():
print('task2 start!')
while True:
print('task2')
time.sleep(1)
def main():
p1=Thread(target=task1)
p1.start()
p2=Thread(target=task2)
p2.start()
if __name__ == '__main__':
main()
比较随意的写法:
import time
from threading import Thread
def task1():
print('task1 start!')
while True:
print('task1')
time.sleep(1)
def task2():
print('task2 start!')
while True:
print('task2')
time.sleep(1)
Thread(target=task1).start()
Thread(target=task2).start()
传参数: 方式一:使用lambda表达式(很简单,实用) 直接使用lambda函数来调用函数
'''
Author:歧路学士
Date:2021年12月2日18:28:10
'''
import time
from threading import Thread
def task1(data):
print('task1 start!')
while True:
print(data)
time.sleep(1)
def task2(data):
print('task2 start!')
while True:
print(data)
time.sleep(1)
def main():
p1=Thread(target=lambda:task1('t1'))
p1.start()
p2=Thread(target=lambda:task2('t2'))
p2.start()
if __name__ == '__main__':
main()
方式二:使用参数 argv,将参数以元组或列表的方式传入 建议使用列表传参,使用元组的话要是只有一个参数必须写成(arg1, )
'''
Author:歧路学士
Date:2021年12月2日18:30:19
'''
import time
from threading import Thread
def task1(data,data2):
print('task1 start!')
while True:
print(data,data2)
time.sleep(1)
def task2(data):
print('task2 start!')
while True:
print(data)
time.sleep(1)
def main():
p1=Thread(target=task1,args=['t1','t12'])
p1.start()
p2=Thread(target=task2,args=('t2',))
p2.start()
if __name__ == '__main__':
main()
方式三:使用全局变量 全局变量也常用于线程之间的通信
'''
Author:歧路学士
Date:2021年12月2日18:49:43
'''
import time
from threading import Thread
def task1():
global data1
print('task1 start!')
while True:
print(data1)
time.sleep(1)
def task2():
global data2
print('task2 start!')
while True:
print(data2)
time.sleep(1)
def main():
p1=Thread(target=task1)
p1.start()
p2=Thread(target=task2)
p2.start()
data1='t1'
data2='t2'
if __name__ == '__main__':
main()
==================================================================================================================
二,多进程 是用来提高计算能力的,可以同时使用电脑的多个核心,,前提是你的电脑得有多个核心,一般一个进城占用一个核心,当你的程序的计算量很大的话可以使用多进程进行加速,但是进程数不宜超过物理核心数,否则会很卡。
注意: 使用多进程必须使用规范格式定义main函数,通常在main函数中启动多进程 不能使用lambda表达式来指明函数
def main():
pass
if __name__ == '__main__':
main()
参数:与多线程差不多,
代码:
'''
Author:歧路学士
Date:2021年12月2日19:05:28
'''
'''
Author:歧路学士
Date:2021年12月2日19:05:28
'''
import time
from multiprocessing import Process
def task1(data):
print('task1 start!')
while True:
print(data)
time.sleep(1)
def task2(data):
print('task2 start!')
while True:
print(data)
time.sleep(1)
def main():
p1=Process(target=task1,args=('t1',))
p1.start()
p2=Process(target=task2,args=['t2'])
p2.start()
if __name__ == '__main__':
main()
我现在的水平比较低,也就制作密码字典和破解密码,以及写爬虫的时候会用到多进程和多线程
个人不建议爬虫启用太多 进程和线程:可能会把目标给搞死!!!
|