· 线程:一堆指令的集合
线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

· 进程:各种资源的集合
程序要以一个整体的形式暴露给操作系统管理,里面包含对各种资源的调用,内存的管理,网络接口的调用等。对各种资源管理的集合就称为进程。

· 进程要操作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 2017-12-03 14:50  super2feng  阅读(127)  评论(0)    收藏  举报