多线程和多进程的效果是不一样的。
一,多线程 是用来提高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:主进程执行完成后,子线程仍然可以存活,主进程等待所有线程完成后才退出。
代码实现:
#比较规范的写法
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
'''
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表达式(在Qt中也叫匿名函数)来调用函数
#比较正规的写法
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
'''
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, )
#比较正规的写法
#比较正规的写法
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
'''
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',))
#只有一个参数使用元组传参后面必须加一个空的参数,使用列表则不需要
#('t2')这样的写法是错误的,它会把字符串拆分,组成新的元组
p2.start()
if __name__ == '__main__':
main()
方式三:使用全局变量
全局变量也常用于线程之间的通信
#比较正规的写法
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
'''
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()
参数:与多线程差不多,
代码:
#比较正规的写法
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
'''
Author:歧路学士
Date:2021年12月2日19:05:28
'''
#比较正规的写法
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
'''
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()
我现在的水平比较低,也就制作密码字典和破解密码,以及写爬虫的时候会用到多进程和多线程
个人不建议爬虫启用太多 进程和线程:可能会把目标给搞死!!!