Python多进程多线程库快速使用demo
使用的Python==3.7.x
使用到了两个库,分别是threading和multiprocessing
使用顺序单调乏味
"""
1.导入进程包
2.使用进程创建对象
3.使用进程对象启动进程指定任务
"""
举个栗子,定义两个函数,载歌载舞。
import time
import os
def sing(num,name):
for i in range(num):
print("sing_pid",os.getpid())
print("sing_pid_father", os.getppid())
#print(name)
print(name,"sing")
time.sleep(0.5)
def dance(t):
for i in range(t):
print("dance_pid", os.getpid())
print("dance")
time.sleep(0.5)
按照往常的运行办法,会按照顺序,如
sing(**)
dance(**)
会先唱完歌再跳舞,有顺序,但是慢的一。
先以多进程为栗子
import multiprocessing
if __name__ == '__main__':
print(os.getpid())
sing_process = multiprocessing.Process(target=sing,args=(3,"pjf"))
dance_process = multiprocessing.Process(target=dance,kwargs={"t":2})
#sing_process.daemon = True ## 守护主进程(主进程结束,子进程销毁)
sing_process.start()
dance_process.start()
29708
sing_pid 29716
dance_pid 5536
dance
sing_pid_father 29708
pjf sing
dance_pid 5536
dance
sing_pid 29716
sing_pid_father 29708
pjf sing
sing_pid 29716
sing_pid_father 29708
pjf sing
and,其中getpid()读取的是子进程的进程号,getppid()是取得父进程的进程号,可以看出来sing和dance都是同一个父进程里的,并且sing_process.daemon = True 是用来守护主进程(主进程结束,子进程销毁)。
再举个栗子,多进程拷贝小电影
def copy_file(file_name,source_dir,dest_dir):
source_path = source_dir+"/"+ file_name
dest_path = dest_dir+"/"+ file_name
with open(source_path,"rb") as source_file:
with open(dest_path,"wb") as dest_file:
while True:
data = source_file.read(1024)
if data:
dest_file.write(data)
else:
break
for file_name in file_list:
sub_pro = multiprocessing.Process(target=copy_file,args=(file_name,source_dir,dest_dir))
sub_pro.start()
多进程结束,下面是关于多线程的
为什么使用多线程?比如QQ可以和多个人聊天,而不需要打开两个QQ和两个人聊天,进程是线程的容器,线程是单元,线程是程序执行的最小单位。但实际调包没啥区别。
import threading
s1 = threading.Thread(target=sing,args=(3,"pjf"),daemon=True) ### 与多进程语法一致
s1.start()
此外,线程的顺序是无序的,可以用下面的代码进行检验:
def task():
time.sleep(1)
thread = threading.current_thread()
print(thread)
溜了