什么是进程(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)
原文:https://www.cnblogs.com/bocaimao/p/10875778.html