Python 多线程和多进程

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:主进程执行完成后,子线程仍然可以存活,主进程等待所有线程完成后才退出。
代码实现:

#比较规范的写法
#!/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()

我现在的水平比较低,也就制作密码字典和破解密码,以及写爬虫的时候会用到多进程和多线程

个人不建议爬虫启用太多 进程和线程:可能会把目标给搞死!!!

你可能感兴趣的:(Python学习,python,开发语言,后端)