进程和线程的区别及相关

什么是进程(process)?

一个程序可执行的实例叫做一个进程。(进程是资源的集合)

每一个进程提供执行这个程序所需的资源,一个进程有一个虚拟的内存地址空间,可执行的代码,调用的操作系统的接头,安全的上下文(权限)

唯一的进程标识符pid,一个优先级类,最小和最大的工作内存空间,进程执行至少需要一个线程,(当提供一个进程的时候,至少提供一个线程),进程中的第一个线程通常被称为主线程,但主线程也可以创建额外的线程(子线程,子线程也可以创建子线程,二者没有递属关系)。

进程和线程的区别?

线程比进程启动快,但是二者的执行速度没有可比性。

1.线程共享内存空间,进程之间的内存空间是独立的。

2.两个线程可以直接访问一个进程的数据,共享内存空间。多个子进程之间的数据不会共享,对于相同数据,他们会copy父进程的,相互之间完全独立。

3.一个进程的多个线程之间可以直接进行交互,(涉及到数据的共享,信息的传递等)。俩个进程想通信,必须通过一个中间代理来实现。

4.新的线程很容易创建,创建新进程需要 对其父进程进行一次克隆。

5.一个线程可以控制和操作同一进程里的其他线程,但是一个进程只能操作它的子进程。

6.对于主线程修改,有可能会影响到其他线程的行为(因为其共享数据),对于父进程的修改不会影响其他子进程的数据(但是父进程删除,子进程会受到影响)

主线程和它启动的子线程是并行的,计算时间时,没有时间串行(依次顺序)关系。 

为了更好的理解:

1.理解并发

 1 import threading
 2 import time
 3 
 4 def run(n):
 5     print("task",n)
 6     time.sleep(2)
 7 
 8 #线程使两个程序并发执行,总共等待2秒
 9 t1 = threading.Thread(target=run,args=("t1",))
10 t2 = threading.Thread(target=run,args=("t2",))
11 t1.start()
12 t2.start()
13 
14 # 对比
15 #二者串行执行,共4秒时间
16 # run('t1')
17 # run('t2')
2.# 继承式调用,类的形式实现并发
 1 # 继承式调用,类的形式实现并发
 2 import threading
 3 import time
 4 
 5 class MyThread(threading.Thread):
 6     def __init__(self, n,sleep_time):
 7         super(MyThread,self ).__init__()
 8         self.n = n
 9         self.sleep_time = sleep_time
10 
11     def run(self):
12         print("running task", self.n)
13         time.sleep(self.sleep_time)
14         print('task done',self.n)
15 
16 t1 = MyThread('t1',2)
17 t2 = MyThread('t2',4)# t1和t2的sleep时间不一致,计算main thread的时间,则二者均需要join
18 
19 t1.start()
20 t2.start()
21 
22 t1.join()
23 t2.join()
24 
25 print('main thread has ...')

3.for循环实现多并发

主线程和其启动的子线程是并行的,二者并无执行完毕的先后顺序。

不加join时,主线程不会等待子线程完成后再往下执行

 1 import threading
 2 import time
 3 
 4 def run(n):
 5     print("task",n)
 6     time.sleep(2)
 7     print('task done', n)
 8     print("------ threads has finished..", threading.current_thread()) # 当前执行的线程类型
 9 
10 
11 start_time = time.time()
12 # for 循环实现多并发
13 t_objs = [] #存线程实例
14 for i in range(50):
15 
16     t = threading.Thread(target=run,args=("t-%s" %i,))
17 
18     t.setDaemon(True) # 把当前线程设置为守护线程
19 
20     t.start()
21 
22     t_objs.append(t) # 为了不阻塞后面的线程启动,不在这里join,先放到一个列表里面
23 #
24 # for t in t_objs: # 循环线程实例列表,等待所有线程执行完毕
25 #     t.join()
26 
27 print("------all threads has finished..",threading.current_thread(),threading.active_count()) # 查看当前线程的类型和活跃个数
28 print('cost:', time.time() - start_time)
29 
30 # 对比
31 # run('t1')
32 # run('t2')

守护线程:

将所有的子线程编程守护线程:即主线程不会等待所有子程序完成后退出,只要主线程执行完毕,就可以退出。

主程序不会等待主线程结束后退出,它会等待非守护线程结束后才退出,程序不会理会守护线程。

守护线程应用场景:socket server设置

多核:同时可以执行多个线程。

但是在python中,同一时间只能执行一个线程。python解释器直接调用c语言的线程接口,仅把上下文传递。线程执行过程中,python无法控制让哪个线程先执行

。故在解释器出口控制,同一时间,只允许一个线程工作,也只允许一个线程得到数据。(添加全局解释器锁)(cpython)

猜你喜欢

转载自www.cnblogs.com/bocaimao/p/10875778.html