python多线程

2023-05-16

 

单线程:

from time import ctime,sleep

def music():
    for i in range(2):
        print "I was listening to music. %s" %ctime()
        sleep(1)

def move():
    for i in range(2):
        print "I was at the movies! %s" %ctime()
        sleep(5)

if __name__ == '__main__':
    music()
    move()
    print "all over %s" %ctime()

先听了一首音乐,通过for循环来控制音乐的播放了两次,每首音乐播放需要1秒钟,sleep()来控制音乐播放的时长。接着我们又看了一场电影,

每一场电影需要5秒钟,因为太好看了,所以我也通过for循环看两遍。在整个休闲娱乐活动结束后,我通过

print "all over %s" %ctime()

看了一下当前时间,差不多该睡觉了。

运行结果:

>>=========================== RESTART ================================
>>> 
I was listening to music. Thu Apr 17 10:47:08 2014
I was listening to music. Thu Apr 17 10:47:09 2014
I was at the movies! Thu Apr 17 10:47:10 2014
I was at the movies! Thu Apr 17 10:47:15 2014
all over Thu Apr 17 10:47:20 2014


#coding=utf-8
import threading
from time import ctime,sleep

def music(func):
    for i in range(2):
        print "I was listening to %s. %s" %(func,ctime())
        sleep(1)

def move(func):
    for i in range(2):
        print "I was at the %s! %s" %(func,ctime())
        sleep(5)


if __name__ == '__main__':
    music(u'爱情买卖')                      #对music()和move()进行了传参处理
    move(u'阿凡达')

    print "all over %s" %ctime()

运行结果:

>>> ======================== RESTART ================================
>>> 
I was listening to 爱情买卖. Thu Apr 17 11:48:59 2014
I was listening to 爱情买卖. Thu Apr 17 11:49:00 2014
I was at the 阿凡达! Thu Apr 17 11:49:01 2014
I was at the 阿凡达! Thu Apr 17 11:49:06 2014
all over Thu Apr 17 11:49:11 2014 


多线程:


#coding=utf-8
import threading
from time import ctime,sleep

def music(func):
    for i in range(2):
        print "I was listening to %s. %s" %(func,ctime())
        sleep(1)


def move(func):
    for i in range(2):
        print "I was at the %s! %s" %(func,ctime())
        sleep(5)

threads = []

t1 = threading.Thread(target=music,args=(u'爱情买卖',))
threads.append(t1)


t2 = threading.Thread(target=move,args=(u'阿凡达',))
threads.append(t2)


if __name__ == '__main__':
    for t in threads:
        t.setDaemon(True)
        t.start()

    print "all over %s" %ctime()


import threading

首先导入threading 模块,这是使用多线程的前提。

threads = []         #创建了threads数组​

t1 = threading.Thread(target=music,args=(u'爱情买卖',))

threads.append(t1)                 #把创建好的线程t1装到threads数组中。​

创建线程t1,使用threading.Thread()方法,在这个方法中调用music方法target=music,args方法对music进行传参。 

接着以同样的方式创建线程t2,并把t2也装到threads数组。

for t in threads:

  t.setDaemon(True)

  t.start()

最后通过for循环遍历数组。(数组被装载了t1和t2两个线程)

setDaemon()

  setDaemon(True)将线程声明为守护线程,必须在start() 方法调用之前设置,如果不设置为守护线程程序会被无限挂起。子线程启动后,父线程也继续执行下去,当父线程执行完最后一条语句print "all over %s" %ctime()后,没有等待子线程,直接就退出了,同时子线程也一同结束。

start()             #始线程活动。

运行结果:


>>> ========================= RESTART ================================
>>> 
I was listening to 爱情买卖. Thu Apr 17 12:51:45 2014 I was at the 阿凡达! Thu Apr 17 12:51:45 2014  all over Thu Apr 17 12:51:45 2014
  从执行结果来看,

​子线程(muisc 、move )和主线程(print "all over %s" %ctime())都是同一时间启动,但由于主线程执行完结束,所以导致子线程也终止。 

优化程序

...
if __name__ == '__main__':
    for t in threads:
        t.setDaemon(True)
        t.start()
    
    t.join()

    print "all over %s" %ctime()

我们只对上面的程序加了个join()方法,用于等待线程终止。

join()的作用是,在子线程完成运行之前,这个子线程的父线程将一直被阻塞。

注意:  join()方法的位置是在for循环外的,也就是说必须等待for循环里的两个进程都结束后,才去执行主进程。

运行结果:

>>> ========================= RESTART ================================
>>> 
I was listening to 爱情买卖. Thu Apr 17 13:04:11 2014  I was at the 阿凡达! Thu Apr 17 13:04:11 2014

I was listening to 爱情买卖. Thu Apr 17 13:04:12 2014
I was at the 阿凡达! Thu Apr 17 13:04:16 2014
all over Thu Apr 17 13:04:21 2014



#coding=utf-8
from time import sleep, ctime 
import threading


def muisc(func):
    for i in range(2):
        print 'Start playing: %s! %s' %(func,ctime())
        sleep(2)
 
def move(func):
    for i in range(2):
        print 'Start playing: %s! %s' %(func,ctime())
        sleep(5)


def player(name):
    r = name.split('.')[1]
    if r == 'mp3':
        muisc(name)
    else:
        if r == 'mp4':
            move(name)
        else:
            print 'error: The format is not recognized!'


list = ['爱情买卖.mp3','阿凡达.mp4']


threads = []
files = range(len(list))

#创建线程
for i in files:
    t = threading.Thread(target=player,args=(list[i],))
    threads.append(t)

if __name__ == '__main__': 
    #启动线程
    for i in files:
        threads[i].start() 
 for i in files:
   threads[i].join()


    #主线程
    print 'end:%s' %ctime()

创建了一个player()函数,这个函数用于判断播放文件的类型。如果是mp3格式的,我们将调用music()函数,如果是mp4格式的我们调用move()函数。哪果两种格式都不是那么只能告诉用户你所提供有文件我播放不了。

然后,我们创建了一个list的文件列表,注意为文件加上后缀名。然后我们用len(list) 来计算list列表有多少个文件,这是为了帮助我们确定循环次数。

接着我们通过一个for循环,把list中的文件添加到线程中数组threads[]中。接着启动threads[]线程组,最后打印结束时间。

split()可以将一个字符串拆分成两部分,然后取其中的一部分


>>> x = 'testing.py'
>>> s = x.split('.')[1]
>>> if s=='py':
    print s
  
py

运行结果:

Start playing: 爱情买卖.mp3! Mon Apr 21 12:48:40 2014
Start playing: 阿凡达.mp4! Mon Apr 21 12:48:40 2014
Start playing: 爱情买卖.mp3! Mon Apr 21 12:48:42 2014
Start playing: 阿凡达.mp4! Mon Apr 21 12:48:45 2014
end:Mon Apr 21 12:48:50 2014
 
现在向list数组中添加一个文件,程序运行时会自动为其创建一个线程。

#coding=utf-8
from time import sleep, ctime 
import threading


def super_player(file,time):
    for i in range(2):
        print 'Start playing: %s! %s' %(file,ctime())
        sleep(time)

​#播放的文件与播放时长
list = {'爱情买卖.mp3':3,'阿凡达.mp4':5,'我和你.mp3':4}

threads = []
files = range(len(list))


#创建线程
for file,time in list.items():
    t = threading.Thread(target=super_player,args=(file,time))
    threads.append(t)

if __name__ == '__main__': 
    #启动线程
    for i in files:
        threads[i].start() 
  for i in files:
      threads[i].join()

    #主线程
    print 'end:%s' %ctime()

首先创建字典list ,用于定义要播放的文件及时长(秒),通过字典的items()方法来循环的取file和time,取到的这两个值用于创建线程。

接着创建super_player()函数,用于接收file和time,用于确定要播放的文件及时长。

 最后是线程启动运行。运行结果:

Start playing: 爱情买卖.mp3! Fri Apr 25 09:45:09 2014
Start playing: 我和你.mp3! Fri Apr 25 09:45:09 2014
Start playing: 阿凡达.mp4! Fri Apr 25 09:45:09 2014
Start playing: 爱情买卖.mp3! Fri Apr 25 09:45:12 2014
Start playing: 我和你.mp3! Fri Apr 25 09:45:13 2014
Start playing: 阿凡达.mp4! Fri Apr 25 09:45:14 2014
end:Fri Apr 25 09:45:19 2014


#coding=utf-8
import threading 
from time import sleep, ctime 
 
class MyThread(threading.Thread):


    def __init__(self,func,args,name=''):
        threading.Thread.__init__(self)
        self.name=name
        self.func=func
        self.args=args
    
    def run(self):
        apply(self.func,self.args)

def super_play(file,time):
    for i in range(2):
        print 'Start playing: %s! %s' %(file,ctime())
        sleep(time)

list = {'爱情买卖.mp3':3,'阿凡达.mp4':5}


#创建线程
threads = []
files = range(len(list))


for k,v in list.items():
    t = MyThread(super_play,(k,v),super_play.__name__)
    threads.append(t)        


if __name__ == '__main__': 
    #启动线程
    for i in files:
        threads[i].start() 
  for i in files:
      threads[i].join()


    #主线程
    print 'end:%s' %ctime()


MyThread(threading.Thread)


 创建MyThread类,用于继承threading.Thread类。

__init__()

使用类的初始化方法对func、args、name等参数进行初始化。  

apply()

apply(func [, args [, kwargs ]]) 函数用于当函数参数已经存在于一个元组或字典中时,间接地调用函数。args是一个包含将要提供给函数的按位置传递的参数的元组。如果省略了args,任何参数都不会被传递,kwargs是一个包含关键字参数的字典。

apply() 用法:

#不带参数的方法
>>> def say():
    print 'say in'


>>> apply(say)
say in


#函数只带元组的参数
>>> def say(a,b):
    print a,b


>>> apply(say,('hello','虫师'))
hello 虫师


#函数带关键字参数
>>> def say(a=1,b=2):
    print a,b

    
>>> def haha(**kw):
    apply(say,(),kw)

    
>>> haha(a='a',b='b')
a b


 
 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python多线程 的相关文章

  • Maven resources的include和exclude

    Maven resources plugin支持明确声明 lt directory gt 指定的资源目录中哪些资源需要处理 xff0c 哪些资源可以不被处理 lt include gt 指明需要包括的资源 xff0c 位于src my re
  • Thymeleaf条件判断

    th if th if属性求Bool值 xff0c 只有true的时候其所在的标签及该标签中的内容才会被渲染到输出结果中 lt a href 61 34 comments html 34 th href 61 34 64 product c
  • 2019 蓝桥杯省赛 A 组模拟赛(一)C. 结果填空:马的管辖 (暴力搜索)

    题目 xff1a 在中国象棋中 xff0c 马是走日字的 一个马的管辖范围指的是当前位置以及一步之内能走到的位置 xff0c 下图的绿色旗子表示马能走到的位置 如果一匹马的某个方向被蹩马脚 xff0c 它就不能往这个方向跳了 xff0c 如
  • Ubuntu下安装使用Xfce4

    安装 xff1a 代码 sudo apt get install xfce4 xfce4 taskbar plugin xfce4 taskbar plugin是我需要 xff0c 你可不用 xff0c 完整安装xfce4 的桌面环境 su
  • isdigit()函数如何判断负数

    在使用字符序列isdigt函数时 xff0c 我们会发现它无法判断负数 xff0c 如 xff1a a 61 39 2 39 39 3 39 4 5 print a 0 isdigit print a 1 isdigit 输出 xff1a
  • 用python操作浏览器的三种方式

    第一种 xff1a selenium导入浏览器驱动 xff0c 用get方法打开浏览器 xff0c 例如 xff1a import time from selenium import webdriver def mac driver 61
  • Linux-虚拟网络设备-veth pair

    基本概念 Virtual Ethernet CableBidirectional FIFOOften used to cross namespaces Linux container 中用到一个叫做veth的东西 xff0c 这是一种新的设
  • openstack-neutron-OVS agent(持续更新)

    概述 ML2Plugin的主要工作是管理虚拟网络资源 xff0c 保证数据正确无误 xff0c 具体物理设备的设置则由Agent完成 L2Agent通常运行在Hypervisor xff0c 与neutron server通过RPC通信 x
  • VUE中使用EventSource接收服务器推送事件

    Vue项目中 xff0c EventSource触发的事件中this指向变了 使用const that 61 this xff0c 然后在EventSource触发的事件中使用that if typeof EventSource 61 61
  • VNC

    一 安装tigervnc server 二 配置登录帐号 三 生成xstartup与log日志 注意 xff1a 如果没有使用vncserver来 设置密码 xff0c 则service vncserver restart 是不会成功的 这
  • DirectUI框架GUIFW

    前言 guifw是一款基于GDI 43 的DirectUI皮肤引擎 xff0c 借鉴了DuiLib和Qt的思想 效果预览 xff1a http download csdn net detail sllins 7707771 代码已开源 xf
  • keil 提示internal command error和no sw device

    1 使用keil烧录软件的时候 xff0c jlink stlink无法识别到芯片 需要排查的问题 1 xff09 换条线 2 xff09 是不是有程序禁用了Seral Wire xff1a 使用cubeide cubeMX xff0c 容
  • 多线程编程模式之Single Threaded Execution 模式

    一 Single Threaded Execution 模式介绍 简单的来说 xff0c Single threaded execution 模式描述了在一种多线程环境下各个线程对于公用资源的使用方式 任一时刻 xff0c 只有一个线程可以
  • NVIDIA Jetson TX2 查看系统相关+运行demo

    1 查看Jetson TX2 L4T版本 xff1a head n 1 etc nv tegra release 2 查看系统版本 xff1a cat etc lsb release 3 查看系统内核 xff1a uname a 4 查看内
  • Docker镜像迁移至新的服务器(全部数据)

    1 找到你想移动的 Docker 容器的 ID 2 提交你的变更 xff0c 并且把容器保存成镜像 xff0c 命名为 newimage docker commit span class token number 3 span a09b25
  • 配置VNC环境在windows主机访问阿里云linux服务器

    配置VNC环境在windows主机访问阿里云linux服务器 虽然作为服务器使用更多的是使用字符终端连接服务器 xff0c 进行操作 xff0c 因为图形界面很消耗性能和资源 xff0c 但有的时候使用图形界面进行操作更为便捷 xff0c
  • pythondataframe输出小结

    在使用dataframe时遇到datafram在列太多的情况下总是自动换行显示的情况 xff0c 导致数据阅读困难 xff0c 效果如下 xff1a coding utf 8 import numpy as np import pandas
  • 聊聊 Redis 为什么构建自己的简单动态字符串 SDS

    我们知道 xff0c Redis 支持字符串 哈希 列表 集合和有序集合五种基本类型 那么我们如何把图片 音频 视频或者压缩文件等二进制数据保存到 Redis 中呢 xff1f 之前在使用 Memcached 缓存这类数据时是把它们转换成
  • 聊聊 Redis 高可用之持久化AOF和RDB分析

    Redis 持久化概述 Redis 是内存数据库 xff0c 数据都是存储在内存中 xff0c 为了避免进程退出导致数据的永久丢失 xff0c 需要定期将 Redis 中的数据以某种形式把内存中的数据保存到磁盘中 xff1b 当 Redis
  • mysqldump: Got error: 1044: Access denied for user XXXX when doing LOCK TABLES

    一 报错信息 在使用mysqldump 执行远程备份数据库的时候报如下错误 xff1a mysqldump Got error span class token number 1044 span Access denied span cla

随机推荐

  • jmap -heap [pid]运行报:Error attaching to process: sun.jvm.hotspot.debugger.DebuggerException(不允许的操作)

    一 运行环境 操作系统 xff1a Ubuntu 5 4 0 6 Java版本 xff1a JDK8 二 执行命令 jmap heap span class token punctuation span pid号 span class to
  • chkconfig: command not found

    问题描述 在 ubuntu1 16 04 10 执行 chkconfig 命令报 chkconfig command not found 说明此服务上没有安装 chkconfig 执行如下命令进行安装 span class token fu
  • Docker 基础篇 之 安装

    一 Docker安装 查看 CentOS 内核版本 Docker 要求 CentOS 系统的内核版本高于3 10 执行如下命令查询 内核版本 span class token function uname span r span class
  • Java 基础 之 Valid 验证

    一 64 Valid 简介 Bean Validation 内置的校验器 校验器说明 64 Null被注解的元素必须为 null 64 NotNull被注解的元素必须不为 null 64 AssertTrue被注解的元素必须为 true 6
  • HttpURLConnection链接详解

    HttpURLConnection链接详解 一 简介 简单来说 xff0c HttpURLConnection 是 Java 提供的发起 HTTP 请求的基础类库 xff0c 提供了 HTTP 请求的基本功能 xff0c 不过封装的比较少
  • Apache HttpClient 详解

    1 简介 HttpClient 是 Apache Jakarta Common 下的子项目 xff0c 用来提供高效的 最新的 功能丰富的支持 HTTP 协议的客户端编程工具包 xff0c 并且它支持 HTTP 协议最新的版本和建议 Htt
  • OKHttp使用详解

    1 简介 OkHttp 是一个默认高效的 HTTP 客户端 xff1a HTTP 2 支持允许对同一主机的所有请求共享一个套接字 连接池减少了请求延迟 xff08 如果 HTTP 2 不可用 xff09 透明 GZIP 缩小了下载大小 响应
  • python二维码生成与扫码

    1 import qrcode img 61 qrcode make 34 hello world 34 img get image show img save 39 hello png 39 2 import qrcode qr 61 q
  • C语言可变参数(从stdarg.h到应用)

    1 什么是可变参数函数 在C语言编程中有时会遇到一些参数可变的函数 xff0c 例如printf scanf xff0c 其函数原型为 xff1a span class token keyword int span span class t
  • OkHttp 缓存实战

    1 简介 在实际业务中可能某些查询数据 xff0c 不经常变化 xff0c 为了节省流量 提高响应速度和增强用户体验等 xff0c 把变化频率小的数据缓存到本地 xff0c 以实现复用 OkHttp 的缓存功能使用起来也比较简单和灵活 xf
  • Feign 详解

    1 Feign 是什么 Feign是一个http请求调用的轻量级框架 xff0c 可以以Java接口注解的方式调用Http请求 Feign通过处理注解 xff0c 将请求模板化 xff0c 当实际调用的时候 xff0c 传入参数 xff0c
  • @Transactional 注解失效情况及解决办法

    一 64 Transactional 注解在了非 public 方法上 如下所示 64 Transactional修饰在了非public方法上 span class token annotation punctuation 64 Servi
  • @Transactional 事务加了 锁 为什么还有并发问题?

    一 原因分析 Spring 中通过在方法上添加注解 64 Transactional 可以很好的处理事务问题 Spring对此的处理原理是对 加了 64 Transactional 注解的方法 添加 AOP切面来时先事务管理的 而 sync
  • 聊聊微服务之什么是微服务及其好处

    一 什么是微服务 微服务就是一些协同工作的小而自治的服务 很小 xff0c 专注于做好一件事 在单一模块系统中 xff0c 随着新功能的增加 xff0c 代码库会越来越大 时间久了代码库会变得非常庞大 xff0c 以至于在什么地方修改都很困
  • RestTemplate 使用详解

    一 简介 常见的http客户端请求工具 xff1a JDK 自带 HttpURLConnectionApache HttpClientOKHttp 以上 工具虽然常用 xff0c 但对于 RESTful 操作相对不是太友好 所以 xff0c
  • BigDecimal 你使用对了吗

    背景 从事金融相关项目 xff0c 对BigDecimal应该是再熟悉不过了 xff0c 也有很多人因为不知道 不了解或使用不当导致资损事件发生 所以 xff0c 如果你从事金融相关项目 xff0c 或者你的项目中涉及到金额的计算 xff0
  • MySQL 中截取字符串的方法

    LEFT str len 从左边开始截取 xff0c 如果字符串为 null 则返回null str xff1a 被截取字符串 xff1b len xff1a 截取长度 span class token keyword SELECT spa
  • Redis 阻塞原因

    Redis 是典型的单线程架构 xff0c 所有的读写操作都是在一条主线程中完成的 当Redis用于高并发场景时 xff0c 这条线程就变的极其重要 如果它出现阻塞 xff0c 就会对应用带来致命的问题 当 Redis 出现阻塞时 xff0
  • 【pcl入门教程系列】之点云Concatenate

    简要说明 点云拼接 Concatenate 是指将点云进行累加在一起 xff0c 只是累加的方式不太一样 一种是点云的字段与维度完全一致 xff0c 数量可以不同 xff0c 两部分点云相加 xff0c 点云的数量增加了 另一种是点云的字段
  • python多线程

    单线程 from time import ctime sleep def music for i in range 2 print 34 I was listening to music s 34 ctime sleep 1 def mov