什么是进程、线程?
①进程:Process;线程:Thread;
②进程是OS分配资源的最小单元,线程是OS调度的最小单元;
③一个程序至少包括一个进程,一个进程至少包括一个线程;线程的尺度更小
④进程执行过程中拥有独立内存单元,不同进程间的内存单元互不干涉;
一个进程中的多个线程在执行过程中共享内存。
进程是资源分配的最小单位,线程是CPU调度的最小单位。
例如打开QQ音乐是一个进程,在QQ音乐里面听歌是一个线程,在QQ音乐里面下载是一个线程,听歌和下载是可以同时进行的(多个线程)。
打开QQ音乐之后,还可以打开office,微信等,每个应用相当于一个进程,多个应用同时打开是多进程。
以下以python多进程(Multiprocessing)和多线程(Threading)为例
常规代码
#!/usr/bin/env python3
# encoding: utf-8
'''常规代码,不使用线程'''
import time
def test(q):
time.sleep(1)
print(q)
def main():
for i in range(4):
name = 'thread' + str(i)
test(name)
print(f'done')
if __name__ == '__main__':
start_time = time.time()
main()
end_time = time.time()
print(f'total time >>>{end_time - start_time}')
以上代码执行完成需要花费4s左右
1、多线程(Threading)
多线程代码
#!/usr/bin/env python3
# encoding: utf-8
'''线程'''
import threading
from queue import Queue
import time
def test(q):
time.sleep(1)
row = q.get()
print(row)
def main():
w = []
q = Queue()
for i in range(4):
name = 'thread' + str(i)
q.put(name)
t = threading.Thread(target = test, name=name, args=(q, ))
t.start()
w.append(t)
for th in w:
th.join()
print(f'done')
if __name__ == '__main__':
start_time = time.time()
main()
end_time = time.time()
print(f'total time >>>{end_time - start_time}')
以上代码执行完成花费1s左右
2、多进程(Multiprocessing)
多进程代码
#!/usr/bin/env python3
# encoding: utf-8
'''进程'''
import multiprocessing
import time
def test(q):
time.sleep(1)
row = q.get()
print(row)
def main():
w = []
q = multiprocessing.Queue()
for i in range(4):
name = 'thread' + str(i)
q.put(name)
t = multiprocessing.Process(target = test, name=name, args=(q, ))
t.start()
w.append(t)
for th in w:
th.join()
print(f'done')
if __name__ == '__main__':
start_time = time.time()
main()
end_time = time.time()
print(f'total time >>>{end_time - start_time}')
以上代码执行完成花费1s左右