python 多线程笔记(1)-- 概念

简介: 本文对不使用线程和使用线程做了一个对比。 假设有两件事情:听歌、看电影 一、不用线程 import time songs = ['爱情买卖','朋友','回家过年','好日子'] movies = ['阿凡达','猩球崛起'] def music(songs): f...

本文对不使用线程和使用线程做了一个对比。

假设有两件事情:听歌、看电影

一、不用线程

import time

songs = ['爱情买卖','朋友','回家过年','好日子']
movies = ['阿凡达','猩球崛起']

def music(songs):
    for s in songs:
        print("开始听歌曲:%s \t-- %s" %(s, time.ctime()))
        time.sleep(3)

def movie(movies):
    for m in movies:
        print("开始看电影:%s \t-- %s" %(m, time.ctime()))
        time.sleep(5)


if __name__ == '__main__':
    # 直接
    start = time.clock()

    music(songs)
    movie(movies)

    print("全部结束,耗时:{:.2f}".format(time.clock() - start))

运行效果图:

我们来计算一下时间:

  歌曲:4 * 3 = 12 秒

  电影:2 * 5 = 10 秒

  合计: 22 秒 (方法:累加)

 

二、使用线程

开两个线程,一个听歌,一个看电影

import threading
import time

songs = ['爱情买卖','朋友','回家过年','好日子']
movies = ['阿凡达','猩球崛起']

def music(songs):
    for s in songs:
        print("开始听歌曲:%s \t-- %s" %(s, time.ctime()))
        time.sleep(3)

def movie(movies):
    for m in movies:
        print("开始看电影:%s \t-- %s" %(m, time.ctime()))
        time.sleep(5)


if __name__ == '__main__':
    
    start = time.clock()
    
    # 创建线程
    t1 = threading.Thread(target=music, args=(songs,))  # 听歌
    t2 = threading.Thread(target=movie, args=(movies,)) # 看电影
    
    # 启动所有线程
    for t in [t1, t2]:
        t.setDaemon(True) # 守护线程
        t.start()
        #t.join() 不要这样
    #t.join() 也不要这样
    
    # 阻塞主线程,直到所有子线程退出
    for t in [t1, t2]:
        t.join()
    
    print("全部线程结束,耗时:{:.2f}".format(time.clock() - start))

运行效果图:

我们来计算一下时间:

  歌曲:4 * 3 = 12 秒

  电影:2 * 5 = 10 秒

  合计:12  秒(方法:取最大值)

 

 三、如果没有 t.join(),则线程进入后台静默运行!

import threading
import time

songs = ['爱情买卖','朋友','回家过年','好日子']
movies = ['阿凡达','猩球崛起']

def music(songs):
    for s in songs:
        print("开始听歌曲:%s \t-- %s" %(s, time.ctime()))
        time.sleep(3)

def movie(movies):
    for m in movies:
        print("开始看电影:%s \t-- %s" %(m, time.ctime()))
        time.sleep(5)


if __name__ == '__main__':

    start = time.clock()
    
    # 创建线程
    t1 = threading.Thread(target=music, args=(songs,))
    t2 = threading.Thread(target=movie, args=(movies,))
    
    # 启动所有线程
    for t in [t1, t2]:
        t.setDaemon(True) # 守护线程
        t.start()
    
    # 阻塞主线程,直到所有子线程退出,若没有,则进入后台静默运行
    #for t in [t1, t2]:
    #    t.join()
    
    print("全部线程结束,耗时:{:.2f}".format(time.clock() - start))

运行效果图:

目录
相关文章
|
存储 数据处理
想让系统更具有弹性?了解背压机制和响应式流的秘密!
想让系统更具有弹性?了解背压机制和响应式流的秘密!
250 0
|
Ubuntu 安全 Shell
Docker指令大全!必备收藏!
Docker指令大全!必备收藏!
240 0
|
Web App开发 API 容器
CoordinatorLayout+AppBarLayout实现上滑隐藏ToolBar-Android M新控件
CoordinatorLayout+AppBarLayout实现上滑隐藏ToolBar-Android M新控件
502 0
|
SQL Java 数据库连接
Springboot集成Mybatis Plus插件
Springboot集成Mybatis Plus插件
449 0
Springboot集成Mybatis Plus插件
|
C语言
C语言之实现矩阵(3行3列)的转置(即行列互换)
C语言之实现矩阵(3行3列)的转置(即行列互换)
718 0
|
1天前
|
云安全 人工智能 自然语言处理
|
6天前
|
搜索推荐 编译器 Linux
一个可用于企业开发及通用跨平台的Makefile文件
一款适用于企业级开发的通用跨平台Makefile,支持C/C++混合编译、多目标输出(可执行文件、静态/动态库)、Release/Debug版本管理。配置简洁,仅需修改带`MF_CONFIGURE_`前缀的变量,支持脚本化配置与子Makefile管理,具备完善日志、错误提示和跨平台兼容性,附详细文档与示例,便于学习与集成。
314 116