线程与进程

线程是应用程序中的最小单元,即操作系统能够进行运算调度的最小单位,它包含在进程中,是进程中的实际运作单位,

一条线程指的是在进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务

每个进程至少包括一个线程,线程间的数据是共享的,每个进程也可生成多个子进程,子进程间的数据默认不共享

很多人一提到python多线程,就想到了GLI(global interpreter lock)全局解释锁,无论你启用多少线程,python在执行时,每次同一时刻,只允许一个线程执行任务,但是这个特性仅仅只是cpython解释器带来的,python这门语言设计并不是依赖于GLI运行的,比如Jpython,使用的是JLI,就不存在这个问题,

 

 

线程与进程区别

1.线程在进程之间是共享内存地址空间的,是通过进程创建的;进程拥有它自己的独立空间

2.线程直接访问它进程的数据块;进程是将父进程中数据再复制出一份使用

3.进程中的线程间是可以直接通信的;子进程与父进程间无非直接通信,但可以通过队列管道相互交流数据

4.一个新的线程创建很容易;一个新的进程创建需要从父进程里重新拷贝父进程的所有数据,耗费资源

5.在进程中的多线程间可以控制其他线程;进程只能控制它的子进程

6.改变主线程优先级会影响线程的在进程中的行为,改变父进程不会影响子进程,

 

复制代码
 1 import threading
 2 import time
 3 
 4 
 5 def say(msg):
 6     print("say :{}".format(msg))
 7     time.sleep(2)
 8 
 9 t = threading.Thread(target=say, args=(1,))  # 函数不能加括号,参数必须用逗号分隔
10 t.start()
11 
12 print("over ???")  # 程序并未在运行到这段代码时结束
13 
14 
15 def say(msg):
16     print("say :{}".format(msg))
17     time.sleep(2)
18 
19 t = threading.Thread(target=say, args=(1,))
20 t.start()
21 t.join()
22 
23 print("game over")  # 通过join实现wait方式,最终执行完这段代码就结束了
复制代码

 

 

通过类方式创建线程

复制代码
 1 class MyThread(threading.Thread):
 2     def __init__(self, msg):
 3         threading.Thread.__init__(self)  # 经典类继承
 4         # super(MyThread, self).__init__(self)
 5         self.msg = msg
 6 
 7     def run(self):  # 必须在类中实现一个这个RUN方法,为线程start调用
 8         time.sleep(2)
 9         print(self.msg)
10 
11 t = MyThread('hello')
12 t.start()
13 
14 
15 for i in range(10):
16     t = threading.Thread(target=say, args=(i,))
17     t.start()
18 
19 print("程序执行到这,未结束")
20 
21 
22 t_list = []  # 创建一个空列表,将线程实例加入进去
23 for i in range(10):
24     t = threading.Thread(target=say, args=(i,))
25     t_list.append(t)
26     t.start()
27     print(t.getName())  # 获取线程名
28 
29 
30 for i in t_list:
31     i.join()
32 
33 print("程序执行到这,结束了")

复制代码

 

 

 

线程锁

复制代码
 1 #线程锁
 2 num = 100
 3 lock = threading.Lock()
 4 
 5 
 6 def addNum():
 7     global num
 8     print("get num {}".format(num))
 9     time.sleep(2)  # 如果锁加在这,程序将等待200秒
10     lock.acquire()  # 加上锁,实际上变成串行运行
11     num -= 1
12     lock.release()  # 释放锁
13 
14 t_list = []
15 
16 for i in range(100):
17     t = threading.Thread(target=addNum)
18     t.start()
19     t_list.append(t)
20 
21 
22 for i in t_list:
23     i.join()  # 阻塞,等待
24 
25 print("程序运行结束,num = [{}]".format(num))
复制代码

 

红绿灯实例

复制代码
 1 #红绿灯
 2 event = threading.Event()
 3 def car(n):
 4     while True:
 5         time.sleep(1)
 6         if event.isSet():  # 绿灯
 7             print("car [%s] is running.." % n)
 8         else:
 9             print("car [%s] is waiting for the red light..." % n)
10             event.wait()
11 
12 def light():
13     if not event.isSet():
14         event.set()  # wait 就不阻塞, # 绿灯状态
15     count = 0
16     while True:
17         if count < 10:
18             print("\033[42;1m---green light on ---\033[0m")
19         elif count < 13:
20             print("\033[43;1m---yellow light on ---\033[0m")
21         elif count < 20:
22             if event.isSet():
23                 event.clear()
24             print("\033[41;1m---red light on ---\033[0m")
25         else:
26             count = 0
27             event.set()  # 打开绿灯
28         time.sleep(1)
29         count += 1
30 
31 if __name__ == "__main__":
32     event = threading.Event()
33     Light = threading.Thread(target=light)
34     Light.start()
35 
36     for i in range(3):
37         t = threading.Thread(target=car, args=(i,))
38         t.start()
复制代码

 

复制代码
 1 #!/usr/bin/env python3
 2 # -*- coding: utf-8 -*-
 3 """
 4 @author: zengchunyun
 5 """
 6 import threading
 7 import time
 8 
 9 
10 def show(i):
11     print("[{:^100}]".format("doubi"))
12     time.sleep(22)
13     print(i)
14 
15 t = threading.Thread(target=show, args=(1,))
16 t.start()
17 t.join(11)  # 设置join,等待线程执行完毕才继续,如果设置超时时间.则在这个时间内,如果线程未执行完毕,则不继续等待,执行后面的代码
18 # , 如果后面的代码执行完毕,线程还未执行完成,依旧等待线程执行
19 print(123)
复制代码

 

posted @ 2018-12-19 14:59  kiddy-x  阅读(130)  评论(0编辑  收藏  举报