· 线程:一堆指令的集合
线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
· 进程:各种资源的集合
程序要以一个整体的形式暴露给操作系统管理,里面包含对各种资源的调用,内存的管理,网络接口的调用等。对各种资源管理的集合就称为进程。
· 进程要操作CPU,至少要先创建一个线程。
· 运算速率:CPU > memory > disk
· 每个程序的内存是相互独立的
· 所有在同一个进程里的线程是共享同一块内存空间的。
1、线程共享内存空间;进程的内存是独立使用的。
2、同一个进程的线程之间可以直接交流;两个进程想通信,必须通过一个中间代理来实现。
3、创建新线程很简单,创建新进程需要对其父进程进行一次克隆。
4、一个线程可以控制和操作同一进程里的其他线程;但是进程只能操作子进程。
5、线程启动速度较进程快。
简单的并发多线程效果:
import threading, time def run(n): print("task",n) time.sleep(2) t1 = threading.Thread(target=run,args=('t1',)) t2 = threading.Thread(target=run,args=('t2',)) t1.start() t2.start() # run('t1') # run('t2')
运行后可发现同时出现task t1和task t2后等2秒结束程序。若单独执行run('t1')和run('t2')的结果是先出现task t1等2秒才出现task t2再等2秒程序才结束。
同时开启50个线程,并计算程序总耗时:
import threading, time def run(n,sleeptime): print("Task: ", n) time.sleep(sleeptime) print("Task %s finished..." % n,threading.current_thread(),threading.active_count()) start_time = time.time() obj_list = [] for i in range(50): t = threading.Thread(target=run,args=(i,3)) # target后接函数名,不用接(),args里面传入的参数个数为1时要加上“,” t.start() # 注意:此处是start,不是run obj_list.append(t) for j in obj_list: j.join() # 等待线程执行完毕 print("______All thread finished...--------",threading.current_thread()) print("Program use: ",(time.time()-start_time))
· threading.current_thread():当前线程类型
· threading.active_count():当前线程数量
· 守护线程:守护线程是不重要的,在进程退出的时候,不用等待这个线程退出。
程序在除守护线程外的所有线程执行完毕后就退出。
将线程(t)设置成守护线程:
t.setDaemon(True) # 设置为守护线程,必须要在t.start()之前设置。
posted on
浙公网安备 33010602011771号