python基础-第九篇-9.2线程与多线程

单线程

import time

beginTime = time.time()
for a in range(10):
    print(a)
    time.sleep(1)
shijian = time.time() - beginTime
print(shijian)  #10.000571966171265

  我们可以看到,上面这段代码就是纯正的单线程,一条道走到黑,讲究先后,所以花了10秒多

多线程

  毕竟等待是让人心烦的,有什么方法能不这么耗时间啊,有啊,主角登场,欢迎多线程,那多线程做了一件什么事呢?它可以同时做多件事,就拿上面例子,在这个线程睡觉时,它会去执行其他的线程。

import threading
import time

def printNum(a):
    time.sleep(1)
    print(a)

beginTime = time.time()
for i in range(10):
    t = threading.Thread(target=printNum,args=(i,))
    t.start()

# for i in range(10):
#     t.join()
shijian = time.time() - beginTime
print(shijian)

结果为:
    0.0010001659393310547
    2
    1
    0
    4
    6
    9
    3
    5
    7
    8

  看到这,你可能会想,输出的结果怎么是无序的,就是因为多线程是每个线程各自去执行自己的,所以就有可能存在抢占输出资源的情况。

  你可能又会想,怎么只要0.001秒就完成了,太不符合逻辑了,那我告诉你,这个时间为主线程的执行时间,如果要知道所有的线程执行时间,只要解注释t.join()这两句代码就可以了,结果一般为1秒多点点。

过程详解

#引入线程模块threading
import threading
import time

#定义线程中的执行方法
def printNum(a):
    print(‘num:‘,a)
    time.sleep(1)

def printStr(str1,str2):
    print(str1,‘:‘,str2)
    time.sleep(1)

#初始化一个线程对象
t_0 = threading.Thread(target=printNum,args=(888,))
#启动线程
t_0.start()

#target指定需要执行的函数名,args指定元组形式的参数
t_1 = threading.Thread(target=printStr,args=(‘this is the arg‘,‘string‘))
t_1.start()

#一次创建10个线程对象并启动
for i in range(10):
    t = threading.Thread(target=printNum,args=(i,))
    t.start()

threading模块详解

  Python的线程中没有优先级、线程组,也不能被停止、暂停、恢复、中断,线程只能随着线程中的代码执行完毕而被销毁、

  threading模块提供的类

  --Thread, Lock, Rlock, Condition, [Bounded]Semaphore, Event, Timer, local

  threading模块里的常用方法

  1. threading.currentThread()  返回当前的线程变量
  2. threading.enumerate()    返回一个包含正在运行的线程的list,正在运行指线程启动后、结束后,不包括启动前和终止后的线程
  3. threading.activeCount()  返回正在运行的线程数量,与len(threading.enumerate())相同结果

join的高级用法

import time
import threading

def printNum(a):
    print(‘num:‘,a)
    time.sleep(1)

def ThreadTest():
    return threading.Thread(target=printNum,args=(999,))

thread_li = []
for i in range(10):
    t = ThreadTest()
    thread_li.append(t)

for t in thread_li:
    t.start()

for t in thread_li:
    t.join()

print(‘finished‘)

  我们从上面的代码可以看出,join方法不再像以前一样让线程一个一个排队执行了,所有的线程并发执行完后,才会执行主线程最后的代码!

Lock类和Rloc类

  锁住资源,让线程一个一个来操作

  • acquire  给线程上锁
  • release  给线程解锁
import threading

lock = threading.Lock()  #创建锁对象
lock.acquire()
lock.acquire() #生成死锁,阻塞
lock.release()
lock.release()

  Lock上锁与解锁两个方法只能一前一后出现,否则很容易出现死锁

import threading

Rlock = threading.RLock()  #创建锁对象
Rlock.acquire()
Rlock.acquire() #没有阻塞
Rlock.release()
Rlock.release()

  而Rlock就比较随意,只要上锁和解锁两个方法成双出现就可以了

更多详细内容请见:http://www.cnblogs.com/xinsiwei18/p/5697802.html

                              欢迎大家对我的博客内容提出质疑和提问!谢谢

                                                                             笔者:拍省先生

时间: 2024-10-11 12:53:02

python基础-第九篇-9.2线程与多线程的相关文章

萌新向Python数据分析及数据挖掘 第一章 Python基础 第九节 类

第一章 Python基础 第九节 类 面向对象编程时,都会遇到一个概念,类,python也有这个概念,下面我们通过代码来深入了解下. 其实类 和函数都是为了节省代码,有了类的的概念,就可以把相同的代码写在父类,子类继承后就可以直接使用,而且通过选择对应的父类就可以直接使用对应父类的内容. 创建和使用类 1 class Dog(): #认识狗这类东西 2 def __init__(self, name, age): #狗是肯定有名字和年龄的,是个狗就有,要用户填写 3 self.name = na

python基础晋级篇

Python开发[第四篇]:Python基础(一) 三元运算 三元运算(三目运算),是对简单的条件语句的缩写. 1 2 3 4 5 # 书写格式 result = 值1 if 条件 else 值2 # 如果条件成立,那么将 “值1” 赋值给result变量,否则,将“值2”赋值给result变量 基本数据类型补充 set set集合,是一个无序且不重复的元素集合 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 2

Python基础 - 第九天 - paramiko模块、进程、线程

本篇内容: 1.paramiko模块使用 2.进程.线程简介 3.python调用线程的方法 4.join - 等待线程执行 5.守护线程 6.GIL - 全局解释器锁 7.互斥锁 8.信号量 9.事件 10.队列 一.paramiko模块使用 1.paramiko模块简介 ? paramiko是一个基于SSH用于连接远程服务器并执行相关操作(SSHClient和SFTPClinet,即一个是远程连接,一个是上传下载服务),使用该模块可以对远程服务器进行命令或文件操作,值得一说的是,fabric

【python自动化第九篇:进程,线程,协程】

简要: 进程与线程 python GIL全局解释器锁 一.PARAMIKO模块 实现远程ssh执行命令 #!/usr/bin/env python # -*- coding:utf-8 -*- #Author:wanghui import paramiko ssh = paramiko.SSHClient() #创建ssh对象 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) #允许连接不在know_hosts文件中的主机 ssh

python基础-第二篇

一.运算符 1.算数运算: 算数运算符相信大家都不陌生吧,尤其是加减乘除,好!那我就带着大家看看最后三个,这三个到底是干什么玩意的? %,取两数相除的余数,看图: **,x的多少次幂,看图: //,取整除,你可以理解为向下取整,看图: 2.比较运算: 注意:当为一个等号时,多为赋值,两个等号为比较,另外不等于常用是!= 3.赋值运算: 4.逻辑运算: 逻辑运算符里,and和or好理解,那我就讲一下not:这家伙就是唱反调的--看图 5.成员运算: 成员运算符,从字面上意思去理解,问谁是不是某组织

【Python基础学习篇十】Python正则表达式(2015-01-01)

一.正则表达式简介 正则表达式用于文本匹配的工具,在源字符串中查找与给定的正则表达式相匹配的部分.一个正则表达式是由字母.数字和特殊字符组成的.正则表达式中有许多特殊的字符,这些特殊字符是构成正则表达式的要素. 1.正则表达式中的特殊字符: 2.正则表达式中的常用限定符: 利用{}可以控制字符重复的次数. 例如,\d{1,4}表示1位到3位的数字: 某些地区的电话号码是8位数,区号也有可能是3位或4位数字. \d{3}-\d{8}|\d{4}-\d{7} 3.限定符与"?"的组合 二.

python基础总结篇——使用Mysql

python操作Mysql,很方便,使用的MySQLdb的库,基本的操作如下: 查询: 1 try: 2 conn = MySQLdb.connect(host=self.ip, user=self.username,passwd=self.password, db=self.dbname, port=self.port) 3 cur = conn.cursor() 4 cur.execute(sql) 5 rows = cur.fetchall() 6 data = rows 7 except

【Python基础学习篇】Python字典

字典(Dictionary)是由"键-值"对组成的集合,字典中的"值"通过"键"来引用. 一.字典的创建 字典由一系列的"键-值"(key-value)对组成,"键-值"对之间用"逗号"隔开,并且被包含在一对花括号中. 创建字典的格式如下: dictionary_name = {key1:value1,key2:value2,...} 如果需要创建一个空的字典,只需要一对花括号即可,如下

Python基础第二篇

一.三元运算 if True: name='a' else: name='b' #上面的代码用三元运算表示: name="a" if True else "b" 二.类中方法查看 Python中一切事物都是对象,对象由类创建 type 查看对象类型 dir(类型名)  查看类中提供的所有功能 help(类型名)    查看类中提供的功能详细 help(类型名.方法名) 查看类中某功能的详细 三.类型常用功能 1.整形 abs(x) #返回绝对值 x+y,x-y,x*