当前位置: 首页 > news >正文

python笔记7-多线程threading之函数式

前言

1.python环境2.7
2.threading模块系统自带

单线程

1.平常写的代码都是按顺序挨个执行的,就好比吃火锅和哼小曲这两个行为事件,定义成两个函数,执行的时候,是先吃火锅再哼小曲,这种就是单线程的行为。

# coding:utf-8
import time
def chi():
    print("%s 吃火锅开始:" % time.ctime())
    time.sleep(1)
    print("%s 吃火锅结束--" % time.ctime())

def heng():
    print("%s 哼着小曲开始:" % time.ctime())
    time.sleep(1)
    print("%s 哼着小曲结束--" % time.ctime())

if __name__ == "__main__":
    chi()
    heng()

Thu Jan 11 16:32:37 2018 吃火锅开始:
Thu Jan 11 16:32:38 2018 吃火锅结束--
Thu Jan 11 16:32:38 2018 哼着小曲开始:
Thu Jan 11 16:32:39 2018 哼着小曲结束--

2.生活中我们是可以一边吃火锅一边哼小曲的,那么代码里面如何实现这种同时进行的不同事件呢?这就是接下来要讲的python多线程

多线程threading

1.Python通过两个标准库thread和threading提供对线程的支持。thread提供了低级别的、原始的线程以及一个简单的锁.Threading模块封装了一些常用的方法,初学者直接学这个模块就行了。

2.Python中使用线程有两种方式:函数或者用类来包装线程对象

3.threading.Thread里面几个参数介绍:

class Thread(_Verbose)
   
   __init__(self, group=None, target=None, name=None, args=(), kwargs=None, verbose=None)
       
       *group*:group参数必须为空,参数group是预留的,用于将来扩展;
 
  参数args和kwargs分别表示调用target时的参数列表和关键字参数。
       
       *target*: 参数target是一个可调用对象(也称为活动[activity]),在线程启动后执行
       
       *name*: 参数name是线程的名字。默认值为“Thread-N“,N是一个数字。
      
       *args*:传递给线程函数target的参数,他必须是个tuple类型.
       
       *kwargs*:kwargs表示关键字参数。字典类型 {}.
   

函数式

1.先看个简单案例,这种是执行函数,函数不带参数的

# coding:utf-8
import threading
import time

def chi():
    print("%s 吃着火锅开始:" % time.ctime())
    time.sleep(1)
    print("%s 吃着火锅:涮羊肉" % time.ctime())
    time.sleep(1)
    print("%s 吃着火锅:涮牛肉" % time.ctime())
    time.sleep(1)
    print("%s 吃着火锅:贡丸" % time.ctime())
    time.sleep(1)
    print("%s 吃火锅结束!" % time.ctime())
def ting():
    print("%s 哼着小曲1!" % time.ctime())
    time.sleep(2)
    print("%s 哼着小曲2!" % time.ctime())
    time.sleep(2)
    print("%s 哼着小曲3!" % time.ctime())
    time.sleep(2)
    print("%s 哼着小曲4!" % time.ctime())
    time.sleep(2)
    print("%s 哼着小曲5!" % time.ctime())
    time.sleep(2)

# 创建线程数组
threads = []
# 创建线程t1,并添加到线程数组
t1 = threading.Thread(target=chi)
threads.append(t1)
# 创建线程t2,并添加到线程数组
t2 = threading.Thread(target=ting)
threads.append(t2)

if __name__ == '__main__':
    # 启动线程
    for t in threads:
        t.start()

运行结果:
Thu Jan 11 16:35:50 2018 吃着火锅开始:
Thu Jan 11 16:35:50 2018 哼着小曲1!
Thu Jan 11 16:35:51 2018 吃着火锅:涮羊肉
Thu Jan 11 16:35:52 2018 哼着小曲2!Thu Jan 11 16:35:52 2018 吃着火锅:涮牛肉

Thu Jan 11 16:35:53 2018 吃着火锅:贡丸
Thu Jan 11 16:35:54 2018 哼着小曲3!Thu Jan 11 16:35:54 2018 吃火锅结束!

Thu Jan 11 16:35:56 2018 哼着小曲4!
Thu Jan 11 16:35:58 2018 哼着小曲5!

2.带参数的用args传元组类型(参数最后多加一个逗号“,”要不然会报错)

# coding:utf-8
import threading
import time

def chi(threadName,name):
    print("%s 吃着%s开始:" % (time.ctime(),threadName))
    print("%s 吃着火锅:涮羊肉" % time.ctime())
    time.sleep(1)
    time.sleep(1)
    print("%s 吃着火锅:涮牛肉" % time.ctime())
    time.sleep(1)
    print("%s 吃着火锅:贡丸" % time.ctime())
    time.sleep(1)
    print("%s 吃着%s结束--" % (time.ctime(),threadName))
    print("%s 运行结束!"%name)


def ting(threadName):
    print("%s 哼着%s1!" % (time.ctime(),threadName))
    time.sleep(2)
    print("%s 哼着小曲2!" % time.ctime())
    time.sleep(2)
    print("%s 哼着小曲3!" % time.ctime())
    time.sleep(2)
    print("%s 哼着小曲4!" % time.ctime())
    time.sleep(2)
    print("%s 哼着小曲5!" % time.ctime())
    time.sleep(2)

# 创建线程数组
threads = []
# 创建线程t1,并添加到线程数组
# t1 = threading.Thread(target=chi, args=("火锅","吃火锅",))

# 传kwargs参数
t1 = threading.Thread(target=chi, kwargs={"threadName":"火锅","name":"吃火锅"})

threads.append(t1)
# 创建线程t2,并添加到线程数组
t2 = threading.Thread(target=ting,args=("小曲",))
threads.append(t2)

if __name__ == '__main__':
    # 启动线程
    for t in threads:
        t.start()

3.或者用kwargs传字典{}类型

# 创建线程t1,并添加到线程数组
# t1 = threading.Thread(target=chi, args=("火锅","吃火锅",))

# 传kwargs参数
t1 = threading.Thread(target=chi, kwargs={"threadName":"火锅","name":"吃火锅"})

封装类和方法的调用下篇介绍

相关文章:

  • org.codehaus.mojo:build-helper-maven-plugin:1.4:add-source (execution: add-sourc
  • CentOS6.X内核升级
  • PDF 补丁丁 0.6.0.3383 版发布(修复书签编辑器坐标定位错误的问题)
  • 虚拟机的安装和连接
  • JS函数式编程 数组部分风格 ES6版
  • linux入门常用操作
  • VTP
  • powershell 性能测试小脚本
  • hihoCoder1603
  • jsp:choose 、when 和 和 otherwise 一组标签
  • “浏览器模式”和“文档模式”之间的区别
  • ​VRRP 虚拟路由冗余协议(华为)
  • h5 meta 移动
  • JQ-weui中的日期选择控件关于时间段的设置!
  • Can't get Kerberos realm
  • Akka系列(七):Actor持久化之Akka persistence
  • C++11: atomic 头文件
  • CODING 缺陷管理功能正式开始公测
  • Docker入门(二) - Dockerfile
  • input的行数自动增减
  • JavaScript 基本功--面试宝典
  • Javascript编码规范
  • OSS Web直传 (文件图片)
  • Travix是如何部署应用程序到Kubernetes上的
  • 数据结构java版之冒泡排序及优化
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • ​人工智能书单(数学基础篇)
  • #1015 : KMP算法
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • %@ page import=%的用法
  • (10)STL算法之搜索(二) 二分查找
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (九)One-Wire总线-DS18B20
  • (离散数学)逻辑连接词
  • (三)Honghu Cloud云架构一定时调度平台
  • (转)mysql使用Navicat 导出和导入数据库
  • (转)Unity3DUnity3D在android下调试
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .Net Core 中间件验签
  • .NET Remoting Basic(10)-创建不同宿主的客户端与服务器端
  • .NET 跨平台图形库 SkiaSharp 基础应用
  • .NET项目中存在多个web.config文件时的加载顺序
  • .net与java建立WebService再互相调用
  • ?php echo ?,?php echo Hello world!;?
  • @value 静态变量_Python彻底搞懂:变量、对象、赋值、引用、拷贝
  • @软考考生,这份软考高分攻略你须知道
  • [20150629]简单的加密连接.txt
  • [AIGC codze] Kafka 的 rebalance 机制
  • [AIGC] MySQL存储引擎详解
  • [Android]使用Retrofit进行网络请求
  • [bzoj 3534][Sdoi2014] 重建
  • [CF543A]/[CF544C]Writing Code
  • [CTO札记]如何测试用户接受度?