Python 异步编程之-线程
上一篇我们讲到,进程是一个相对独立的单元。而线程则是一个进程内单一顺序的控制流,是操作系统运行调度的最小单元。因此,一个进程可以包含多个线程。比如,播放视频时,画面和声音就是不同的线程在处理。
1.创建线程
(1)使用threading.Thread()直接创建
def fun1():
print('任务1开始')
time.sleep(2)
print('任务1结束')
def fun2():
print('任务2开始')
time.sleep(4)
print('任务2结束')
thread1 = threading.Thread(target=fun1)
thread2 = threading.Thread(target=fun2)
# 守护线程,随主线程结束而结束,即不会打印“任务2结束”
thread2.setDaemon(True)
# 启动任务
thread1.start()
thread2.start()
# 主线程会等待本线程完成
thread1.join()
(2)继承Thread
class MyThread(threading.Thread):
# 可以给线程取名字
def __init__(self, name):
super().__init__(name=name)
# 需要实现的核心代码
def run(self):
print("这里写核心功能")
t = MyThread('线程1')
t.start()
t.join()
2.线程间通讯
同一个进程下的线程,使用的是同一块内存。因此天然可以进行通信。此外,还可以使用队列。参看第3部分。
# 定义任意类型的全局变量都可以实现线程间通信
lst = []
def fun1():
global lst
lst.append(1)
def fun2():
global lst
dt = lst.pop()
print(dt)
thread1 = threading.Thread(target=fun1)
thread2 = threading.Thread(target=fun2)
thread1.start()
thread2.start()
3.数据安全和锁的概念
先直接看一个例子
import threading
def add():
global total
for i in range(1000000):
total += 1
def desc():
global total
for i in range(1000000):
total -= 1
if __name__ == '__main__':
total = 0
thread1 = threading.Thread(target=add)
thread2 = threading.Thread(target=desc)
thread1.start()
thread2.start()
thread1.join()
thread2.join()
print(total)
更多请看:
Python 异步编程之-线程
相关文章:
Python 异步编程之-线程
为者常成,行者常至
自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)