前言:
这是我看了这位b站老师做的笔记,听课完后觉得很简单,感觉我这笔记还写得有点啰嗦,线程和进程原理差不多,看了进程就可以跳着看线程了(反正我是这样的,哈哈)
python中可以使用多进程 来实现多任务。
#1. 导包
import multiprocessing
#2. 通过进程类创建进程对象
进程对象=multiprocessing.Process(target=任务名)
#3. 启动进程执行任务
进程对象.start()
练习:
import multiprocessing
import time
#创建两个任务
defsing():
for i inrange(3):
print('唱歌...')
time.sleep(1.5)
defdance():
for i inrange(3):
print('跳舞..')
time.sleep(1.5)
if __name__=='__main__':#main是主进程
#使用进程类创0建进程对象
#target指定执行函数名.记住:一定要指定
sing_process=multiprocessing.Process(target=sing)
dance_process=multiprocessing.Process(target=dance)
#使用进程对象启动进程执行指定任务
sing_process.start()
dance_process.start()
'''输出
唱歌...
跳舞..
唱歌...
跳舞..
唱歌...
跳舞..
'''
练习:将上面代码3改为num
import multiprocessing
import time
#创建两个任务
defsing(num):
for i inrange(num):
print('唱歌...')
time.sleep(1.5)
defdance():
for i inrange(num):
print('跳舞..')
time.sleep(1.5)
if __name__=='__main__':
sing_process=multiprocessing.Process(target=sing,args=(3,))#按照参数顺序
dance_process=multiprocessing.Process(target=dance,kwargs={"num":2})#保证参数名一致就行
#使用进程对象启动进程执行指定任务
sing_process.start()
dance_process.start()
'''
跟上述代码输出一样
'''
作用:当程序进程多时,没办法区分主进程和子进程,为了方便管理给每个进程设定编号
注意:需要导入os包
获取当前进程编号:os.getpid
获取父进程编号:os.getppid
import multiprocessing
import time
import os#导入os
#创建两个任务
defsing():
print('唱歌...')
print("当前唱歌进程编号",os.getpid())
print("获取父进程编号",os.getppid())
time.sleep(1.5)
if __name__=='__main__':
#使用进程类创0建进程对象
#target指定执行函数名.记住:一定要指定
print("当前主机进程编号",os.getpid())
sing_process=multiprocessing.Process(target=sing)
#使用进程对象启动进程执行指定任务
sing_process.start()
'''输出
当前主机进程编号 7744
唱歌...
当前唱歌进程编号 20328
获取父进程编号 7744
'''
听到守护,是不是想到你那个夜晚对呀发誓要守护她一生一世
这里的守护可不一样
让我们来看看守护进程是什么:
子进程对象.daemon=True
import multiprocessing
import time
defwork():
for i inrange(10):
print("工作中。。。")
time.sleep(0.2)
if __name__=='__main__':
#创建子进程
sum_process=multiprocessing.Process(target=work)
sum_process.daemon=True#设置守护主进程,主进程退出后子进程直接销毁,不在执行
sum_process.start()
time.sleep(1)
print("主进程执行完成")
'''输出
工作中。。。
工作中。。。
工作中。。。
工作中。。。
工作中。。。
主进程执行完成
'''
你们可以去掉守护进程自己去试一下,后面还会运行子进程
在python中还可以使用多线程完成多任务
为什么使用
总结:
(1)线程是程序执行的最小单位. (2)同属一个进程的多个线程共享进程所拥有的全部资源.
import threading
线程对象=threading.Thread(target=任务名)
线程对象.start()
代码实例
import threading
import time
#创建两个任务
defsing():
for i inrange(3):
print('唱歌...')
time.sleep(1.5)
defdance():
for i inrange(3):
print('跳舞..')
time.sleep(1.5)
if __name__=='__main__':
#使用进程类创0建进程对象
#target指定执行函数名.记住:一定要指定
sing_process=threading.Thread(target=sing)
dance_process=threading.Thread(target=dance)
#使用进程对象启动进程执行指定任务
sing_process.start()
dance_process.start()
代码解析:跟进程不同,唱歌跳舞是同时出现的,遍历了三次
(1)threading.Thread(target=work, daemon=True)
(2)线程对象.setDaemon(True)
差不多跟进程一样,就不上代码了
介绍:多进程执行时无序的,是由cpu调度决定某个线程先执行的
上代码
import threading
import time
def task():
time.sleep(2)
#current_thread():获取当前线程的线程对象
thread=threading.current_thread()
print(thread)
if __name__== '__main__':
for i in range(5):
sub_thread=threading.Thread(target=task)
sub_thread.start()
'''输出
<Thread(Thread-2, started 12040)>
<Thread(Thread-3, started 3856)>
<Thread(Thread-1, started 20524)>
<Thread(Thread-4, started 7800)>
<Thread(Thread-5, started 20360)>
'''
我们可以看到,输出的是23145,顺序是被打乱的,所以多进程是无序的
1.关系对比 (1)线程是依附于进程的,没有进程就没线程 (2)一个进程默认提供一条线程,进程可以创建多个线程
(1)线程可以用多核,进程不能 (2)开销的大小
作者:神的孩子都在歌唱 本人博客:https://blog.csdn.net/weixin_46654114 转载说明:务必注明来源,附带本人博客连接