DEV Community

Corwien
Corwien

Posted on

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()

Enter fullscreen mode Exit fullscreen mode

(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()
Enter fullscreen mode Exit fullscreen mode

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()
Enter fullscreen mode Exit fullscreen mode

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)
Enter fullscreen mode Exit fullscreen mode

更多请看:
Python 异步编程之-线程


相关文章:
Python 异步编程之-线程

Top comments (1)

Collapse
 
corwien profile image
Corwien

不错哎