Python线程基础

进程与线程的区别

进程概念

       进程是表示资源分配的基本单位,又是调度运行的基本单位。例如,用户运行自己的程序,系统就创建一个进程,并为它分配资源,包括各种表格、内存空间、磁盘空间、I/O设备等。然后,把该进程放人进程的就绪队列。进程调度程序选中它,为它分配CPU以及其它有关资源,该进程才真正运行。所以,进程是系统中的并发执行的单位。

       在Mac、Windows NT等采用微内核结构的操作系统中,进程的功能发生了变化:它只是资源分配的单位,而不再是调度运行的单位。在微内核系统中,真正调度运行的基本单位是线程。因此,实现并发功能的单位是线程。

线程概念

       线程是进程中执行运算的最小单位,亦即执行处理机调度的基本单位。如果把进程理解为在逻辑上操作系统所完成的任务,那么线程表示完成该任务的许多可能的子任务之一。例如,假设用户启动了一个窗口中的数据库应用程序,操作系统就将对数据库的调用表示为一个进程。假设用户要从数据库中产生一份工资单报表,并传到一个文件中,这是一个子任务;在产生工资单报表的过程中,用户又可以输人数据库查询请求,这又是一个子任务。这样,操作系统则把每一个请求――工资单报表和新输人的数据查询表示为数据库进程中的独立的线程。线程可以在处理器上独立调度执行,这样,在多处理器环境下就允许几个线程各自在单独处理器上进行。操作系统提供线程就是为了方便而有效地实现这种并发性

引入线程的好处

(1)易于调度。

(2)提高并发性。通过线程可方便有效地实现并发性。进程可创建多个线程来执行同一程序的不同部分。

(3)开销少。创建线程比创建进程要快,所需开销很少。。

(4)利于充分发挥多处理器的功能。通过创建多线程进程(即一个进程可具有两个或更多个线程),每个线程在一个处理器上运行,从而实现应用程序的并发性,使每个处理器都得到充分运行。

线程与进程之间的关系与区别:

关系:

1,一个线程只能属于一个进程,一个进程可以有多个线程,但至少有一个线程。

2,同一进程的线程共享该进程的所有资源。

3,处理机上真正运行的是线程

4,线程执行需要协作同步。不同线程可通过消息同步实现线程通信。

区别:

1,调度:线程是调度和分配的基本单位,进程是拥有资源的基本单位

2,并发:进程可以并发执行,同一进程间的多个线程也可以并发执行。

3,系统开销:系统中主要进行资源回收的地方是堆,堆是线程共有的,也就是进程所有的资源,所有创建线程的开销比创建进程的小很多。

主线程和分线程

1.代码运行默认都是在主线程里面,如果需要执行新的任务,可以开辟分线程

2.分线程个数没有限制,分线程里面的任务结束后,分线程结束

分线程的使用场景

1.当有大量任务需要执行的时候,可以将任务放入到分线程里面

2.当有大量任务需要执行的时候,而任务的执行顺序需要制定的时候,可以使用分线程

3.当界面有大量效果(界面)需要更新的时候,需要放入分线程

同步任务和异步任务

同步任务

上一个任务没有完成,下一个任务不能开始

异步任务

可以同时执行多个任务,上一个任务没有完成,下一个任务也可以开启

分线程和异步的区别

1.分线程可以同时执行多个任务,所有的任务分线程自己完成

2.异步可以同时执行多个任务,但是自己只做一个任务,其他任务命令其他人来完成

import threading
# 获取当前线程的名称
print('当前线程为',threading.current_thread().name)
def myThread():
    print('位置1',threading.current_thread().name)
    print('位置2', threading.current_thread().name)
    print('位置3', threading.current_thread().name)
    print('位置4', threading.current_thread().name)
    print('位置5', threading.current_thread().name)
    print('位置6', threading.current_thread().name)
# threading.Thread 开辟一个新的线程
sub_thread = threading.Thread(target=myThread,name='newThread')
# 开始执行分线程
sub_thread.start()
# 分线程代码结束以后,会回归到主线程
print('outside1',threading.current_thread().name)
print('outside2',threading.current_thread().name)
print('outside3',threading.current_thread().name)
print('outside4',threading.current_thread().name)
print('outside5',threading.current_thread().name)

运行结果为:

当前线程为 MainThread
位置1 newThread
outside1 MainThread
位置2 newThread
outside2 MainThread
位置3 newThread
outside3 MainThread
位置4 newThread
outside4 MainThread
位置5 newThread
outside5 MainThread
位置6 newThread

当程序运行时,会先在主线程运行(因为在程序刚开始的时候只有主线程,没有分线程),然后会根据情况进入到分线程,主线程和分线程的任务是同时进行的,线程与线程之间互不影响,所以感觉是交叉的。

猜你喜欢

转载自blog.csdn.net/qq_42543312/article/details/81348281