python 多线程

一,多线程概念:

线程是程序执行最小单位,实际上进程只负责分配资源,而利用这些资源执行程序的是线程,也就是说进程是线程的容器,一个进程中最少有一个线程来负责执行程序。同时线程自己不拥有系统资源,只需要一点儿在运行中必不可少的资源,但他可与同属一个进程的其他线程共享进程所拥有的全部资源。这就像通过微信(一个进程)打开多个聊天窗口(多个线程)聊天一样,实现多任务的同时也节省了资源

二,线程的创建步骤

1.导入进程包

  import threading

2.通过进程类创建进程对象

  进程对象 = threading.Thread(target=任务名)

3.启动进程执行任务

  线程对象.start()
通过线程类创建线程对象

线程对象=threading.Thread(target=任务名)

参数名

说明

target

执行的目标任务名,这里指的是函数名(方法名)

name

线程名,一般不用设置

group

线程组,目前只能使用None

三,详细案例

(1).使用多线程实现多任务

import time
import threading
def listen():
    for i in range(3):
        print("在听薛之谦唱歌~~")
        time.sleep(1)
def dance():
    for i in range(3):
        print("在看薛之谦跳舞")
        time.sleep(1)

if __name__ == "__main__":
    #正常按顺序执行
    # listen()
    # dance()
    #使用多线程执行任务
    list_thread=threading.Thread(target=listen)
    dance_thread=threading.Thread(target=dance)
    #启动程序
    list_thread.start()

(2)线程执行携带参数任务

import time
import threading
def listen(num,name):
    for i in range(num):
        print(name)
        print("在听薛之谦唱歌~~")
        time.sleep(1)
def dance(count):
    for i in range(count):
        print("在看薛之谦跳舞")
        time.sleep(1)

if __name__ == "__main__":
    #以元组的方式进行传递
    list_thread=threading.Thread(target=listen,args=(3,"薛之谦"))#元组如果是一个参数别忘了添加逗号
    # 以字典的方式进行传递
    dance_thread=threading.Thread(target=dance,kwargs={"count":5})

    # 启动线程
    list_thread.start()
    dance_thread.start()

(3)主线程和子线程的结束术顺序

一般情况下,主线程都是等带子线程结束后,在结束的

import time
import threading
def work():
    # 子线程工作2秒后结束
    for i in range(10):
        print("工作中...")
        time.sleep(0.2)

if __name__ == "__main__":
    # sub_thread = threading.Thread(target=work)
    # sub_thread.start()
    # 启动线程
    sub_thread.start()
    #主线程等待1秒后结束
    time.sleep(1)
    print("主线程结束了")

主线程结束不想等待子线程结束在结束,可以设置子线程守护主线程式

import time
import threading
def work():
    # 子线程工作2秒后结束
    for i in range(10):
        print("工作中...")
        time.sleep(0.2)

if __name__ == "__main__":
    # sub_thread = threading.Thread(target=work)
    # sub_thread.start()

    # 主线程结束不想等待子线程结束在结束,可以设置子线程守护主线程
    # 方式1.sub_thread = threading.Thread(target=work,daemon=True)
    # 方式2.线程对象.setDaemon(True)

    sub_thread = threading.Thread(target=work)

    # 注意: 结束子进程必须在启动命令之前
    sub_thread.setDaemon(True)
    
    # 启动线程
    sub_thread.start()
    #主线程等待1秒后结束
    time.sleep(1)
    print("主线程结束了")

(4)线程的执行顺序

import threading
import time
def task():
    # 这里延迟一秒是为了方便观察,
    # 因为计算机同时创建5个,看不出来执行的先后顺序
    time.sleep(1)
    # 获取当前线程的对象
    thread=threading.current_thread()
    print(thread)

if __name__ == "__main__":
    for i in range(5):
        sub_thread = threading.Thread(target=task)
        sub_thread.start()

# 结论:多线程执行顺序是无顺序的,由cpu来调度

结论:多线程执行顺序是无顺序的,由cpu来调度,我们无法判断谁先开始执行

四,最后进程和线程的区别

区别对比

1.创建进程的资源比创建线程的资源开销大

2.进程操作系统资源分配的基本单位,线程是cpu调度的基本单位

3.线程不能够独立执行,必须依存在进程中

I.进程优缺点:

优点:可以用多核

缺点:资源开销大

II.线程的优缺点:

优点:资源开销小

缺点:不能使用多核

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值