threading模块介绍
multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性,因而不再详细介绍
官网链接:https://docs.python.org/3/library/threading.html?highlight=threading#
开启多线程的两种方法
方法1: 常用
from threading import Thread
def task():
print('is running')
if __name__=='__main__':
t=Thread(target=task,)
t.start() #开启线程的开销小,速度快 线程开启在进程里,基于当前进程的空间中开启线程
print('主')
'''
开启一个线程的打印结果: 依次打印
is running
主
'''
from multiprocessing import Process
def task():
print('is ruuing')
if __name__=='__main__':
p=Process(target=task,)
p.start()#开启进程的开销大,速度慢,发送开启进程的指令给系统后,系统需要调用资源开启,需要时间,这时print打印操作已经执行
print('主')
'''
开启进程的打印结果:
主
is ruuing
'''
方法2: 不常用,也有人这么用
from threading import Thread
class Mythread(Thread):
def run(self):
print('is running')
if __name__=='__main__':
t=Mythread()
t.start()
print('主')
'''
is running
主
'''
在一个进程下开启多个线程与在一个进程下开启多个子进程的区别
from threading import Thread class Mythread(Thread): def run(self): print('is running') if __name__=='__main__': t=Mythread() t.start() print('主') ''' is running 主 ''' from threading import Thread from multiprocessing import Process import os def task(): print('%s is running' %os.getpid()) if __name__=='__main__': t1=Thread(target=task,) t2 = Thread(target=task, ) t1.start() t2.start() print('主',os.getpid()) ''' #都是在同一个进程中 1884 is running 1884 is running 主 1884 ''' from threading import Thread from multiprocessing import Process import os def task(): print('%s is running' %os.getpid()) if __name__=='__main__': p1=Process(target=task,) p2 = Process(target=task, ) p1.start() p2.start() print('主',os.getpid()) ''' #主进程id和两个子进程id 主 7816 6452 is running 8436 is running '''
from threading import Thread from multiprocessing import Process n=100 def work(): global n n=0 if __name__=='__main__': p=Process(target=work,) p.start() p.join() print('主',n) ''' 主 100 发现n并没有被修改 因为主进程是这个程序就run 这个文件,子进程是p,只进程和子进程空间上完全独立 创建子进程p的时候,子进程拷贝父进程的状态,里边也包括 n=100,然后global n=0 修改的是子进程的全局变量, 打印的n是父进程的全局变量,所以没有变 ''' from threading import Thread from multiprocessing import Process n=100 def work(): global n n=0 if __name__=='__main__': t=Thread(target=work,) t.start() print('主',n) ''' 主 0 发现改变了 以为同一进程内的线程之间空间共享 '''