1.多线程
线程是程序执行的最小单位,一个进程至少有一个线程。
提高并发性。通过线程可方便有效地实现并发性。进程可创建多个线程来执行同一程序的不同部分。
进程之间不能共享内存,但线程之间共享内存非常容易。
Python 常用的多线程库有threading 和 Queue,threading 模块的Thread 类是主要的执行对象.
住线程和子线程是并行工作的:
示例:
from threading import Thread
from time import sleep, ctime
def func(name, sec):
print('---开始---', name, '时间', ctime())
sleep(sec)
print('***结束***', name, '时间', ctime())
# 创建 Thread 实例
t1 = Thread(target=func, args=('第一个线程', 1))
t2 = Thread(target=func, args=('第二个线程', 2))
# 启动线程运行
t1.start() #两个线程在有足够运行空间的前提下会同时运行
t2.start()
# 等待所有线程执行完毕
t1.join() # join() 等待线程终止,要不然一直挂起
t2.join()
start() 是方法用来启动线程的执行。
join() 方法是一种自旋锁,它用来等待线程终止。也可以提供超时的时间,当线程运行达到超时时间后结束线程,如join(500),500毫秒后结束线程运行。
运行结果,程序总共运行两秒,如果程序按照线性运行需要3秒,节约1秒钟
—开始— 一 时间 Fri Nov 29 11:34:31 2019
—开始— 二 时间 Fri Nov 29 11:34:31 2019
结束 一 时间 Fri Nov 29 11:34:32 2019
结束 二 时间 Fri Nov 29 11:34:33 2019
在下面程序中,住线程执行完毕了,子线程依旧在执行,是由于子主线程并行执行造成的
import time
import threading
def work():
for i in range(10):
print('work...')
time.sleep(0.2)
if __name__ == '__main__':
# 创建子进程
work_thread = threading.Thread(target=work)
# 启动线程
work_thread.start()
# 延时1s
time.sleep(1)
print('主线程执行完毕')
可以通过守护线程的方法来实现,子线程可以随主线程注销而注销
work_thread = threading.Thread(target=work, daemon=True)
或者work_thread.setDaemon(True)
import time
import threading
def work():
for i in range(10):
print('work...')
time.sleep(0.2)
if __name__ == '__main__':
# 创建子线程并设置守护主线程
work_thread = threading.Thread(target=work, daemon=True)
# 启动线程
work_thread.start()
# 延时1s
time.sleep(1)
print('主线程执行完毕')
2.多进程
进程是资源分配的最小单位,一个程序至少有一个进程。
进程间不共享全局变量,即使变量名是相同的,其各自指向的地址也不同
创建子进程会对主进程资源进行拷贝,也就是说子进程是主进程的一个副本,好比是一对双胞胎,之所以进程之间不共享全局变量,是因为操作的不是同一个进程里面的全局变量,只不过不同进程里面的全局变量名字相同而已。
用的库是multiprocessing
和多线程一样,进程和主进程是并行执行的,所以在主进程执行完后,子进程仍然在执行工作函数中的任务。
多进程也有守护进程机制:work_process.daemon = True
示例
import multiprocessing
import time
# 工作函数
def work():
for i in range(10):
print('工作中...')
time.sleep(0.2)
if __name__ == '__main__':
# 创建子进程
work_process = multiprocessing.Process(target=work)
# 设置守护主进程,主进程退出后子进程直接销毁,不再执行子进程中的代码
work_process.daemon = True
# 启动子进程
work_process.start()
# 延迟1s
time.sleep(1)
print('主进程执行完毕')
3.总结
多进程和多线程的区别:进程是分配资源的最小单位,线程是程序执行的最小单位,进程负责分配资源,线程负责执行,线程可以和其他同属一个进程的线程共享资源。
参考:
https://zhuanlan.zhihu.com/p/91601448
https://zhuanlan.zhihu.com/p/637105176