python多线程和多进程

1.多线程

线程是程序执行的最小单位,一个进程至少有一个线程。
提高并发性。通过线程可方便有效地实现并发性。进程可创建多个线程来执行同一程序的不同部分。
进程之间不能共享内存,但线程之间共享内存非常容易。
Python 常用的多线程库有threading 和 Queue,threading 模块的Thread 类是主要的执行对象.
python多线程和多进程_第1张图片
住线程和子线程是并行工作的:
python多线程和多进程_第2张图片

示例:

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.多进程

进程是资源分配的最小单位,一个程序至少有一个进程。
进程间不共享全局变量,即使变量名是相同的,其各自指向的地址也不同
python多线程和多进程_第3张图片创建子进程会对主进程资源进行拷贝,也就是说子进程是主进程的一个副本,好比是一对双胞胎,之所以进程之间不共享全局变量,是因为操作的不是同一个进程里面的全局变量,只不过不同进程里面的全局变量名字相同而已。

用的库是multiprocessing

和多线程一样,进程和主进程是并行执行的,所以在主进程执行完后,子进程仍然在执行工作函数中的任务。
python多线程和多进程_第4张图片

多进程也有守护进程机制: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

你可能感兴趣的:(python,开发语言)