python之路——多线程

1、多线程模块 import threading

2、用函数写一个多线程例子

import threading,time
def talk(name):
    print(name,"is tlaking",threading.current_thread(),threading.active_count())
    time.sleep(2)
    print("thread done ....",name)

p1 = threading.Thread(target=talk,args = ("alex",))
p2 = threading.Thread(target=talk,args = ("japhi",))
p1.start()
p2.start()

  结果是:

alex is tlaking <Thread(Thread-1, started 5680)> 2
japhi is tlaking <Thread(Thread-2, started 4592)> 3
thread done .... alex
thread done .... japhi

其中threading.current_thread() 用来打印当前的线程,threading.active_count()打印线程数,结果是一起运行。

3、用面向对象的方式写一个多线程

import threading,time
class Mythread(threading.Thread):
    def __init__(self,name):
        super(Mythread,self).__init__()
        self.name = name
    def run(self):                                  #必须是run
        print(self.name,"is tlaking")
        time.sleep(2)

p3 = Mythread("alex")
p4 = Mythread("japhi")
p3.start()
p4.start()

  但是,面向对象的形式中的方法名必须是run

4、join()方法

  join方法是指当前线程执行完才能继续执行下一个线程,代码示例

import threading,time
start_time = time.time()
def talk(name):
    print(name,"is tlaking",threading.current_thread(),threading.active_count())
    time.sleep(2)
    print("thread done ....",name)
p1 = threading.Thread(target=talk,args = ("alex",))
p2 = threading.Thread(target=talk,args = ("japhi",))
p1.start()
p1.join()
p2.start()
print("cost:",time.time() - start_time)

结果是:

先打印:alex is tlaking <Thread(Thread-1, started 3444)> 2
2秒后。。。
打印:thread done .... alex
japhi is tlaking <Thread(Thread-2, started 11988)> 2
cost: 2.0001144409179688
2秒后打印:thread done .... japhi

  等1线程执行完后才执行线程2

4、以一个循环的例子:

import threading,time
start_time = time.time()
def talk(name):
    print(name,"is tlaking",threading.current_thread(),threading.active_count())
    time.sleep(2)
    print("thread done ....",name)
res = []
for i in range(10):
    p1 = threading.Thread(target=talk,args = (i,))    #多线程并发,target是任务,args是参数,参数后面一定要加,
    p1.setDaemon(True)  # 把当前线程变为守护线程
    p1.start()
    res.append(p1)
for obj in res:
    obj.join()

print("cost:",time.time() - start_time)

  计算10个线程都结束后花的时间,结果是cost: 2.0021145343780518

5、守护线程

  t.setDaemon(True)   将t这个线程设为守护线程,主线程代码结束后不会等t线程是否结束,直接退出程序

import threading,time
start_time = time.time()
def talk(name):
    print(name,"is tlaking",threading.current_thread(),threading.active_count())
    time.sleep(2)
    print("thread done ....",name)
for i in range(10):
    p1 = threading.Thread(target=talk,args = (i,))    #多线程并发,target是任务,args是参数,参数后面一定要加,
    p1.setDaemon(True)  # 把当前线程变为守护线程
    p1.start()
print("cost:",time.time() - start_time)

  结果是:

时间: 2025-01-19 13:50:44

python之路——多线程的相关文章

python之路-----多线程与多进度

一.进程和线程的概念 1.进程(最小的资源单位): 进程:就是一个程序在一个数据集上的一次动态执行过程.进程一般由程序.数据集.进程控制块三部分组成. 程序:我们编写的程序用来描述进程要完成哪些功能以及如何完成: 数据集;则是程序在执行过程中所需要使用的资源: 进程控制块:用来记录进程的外部特征,描述进程的执行变化过程,系统可以利用它来控制和管理进程,它是系统感知进程存在的唯一标志. 进程比线程更早出现,计算机早期处理代码时,使用的是串行的方法,假设计算机在运行A,B,C三个软件,需要A运行完了

Python之路【第七篇】:线程、进程和协程

Python之路[第七篇]:线程.进程和协程 Python线程 Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #!/usr/bin/env python # -*- coding:utf-8 -*- import threading import time   def show(arg):     time.sleep(1)     print 'thread'+str(arg)   for i in

Python之路【第六篇】:socket

Python之路[第六篇]:socket Socket socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. socket起源于Unix,而Unix/Linux基本哲学之一就是"一切皆文件",对于文件用[打开][读写][关闭]模式来操作.socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO.打开.关闭

Python之路_Day10

Python之路_Day10_课堂笔记 上节回顾: socket: 1.导入模块 2.创建socket 3. 字节 send:每次发送可能没有完全发送,send发送后会有一个返回值,是本次发送了多少. sendall:循环发送,直到全部发送完全. 接收 recv(2048):最多可以接收2048字节,上传文件时需要注意 粘包: socketserver: 1.自定义类 2.继承socketserver.BaseRequestHandler类 3.重写handle方法 4.socketserver

Python之路【第九篇】:Python基础(26)——socket server

socketserver Python之路[第九篇]:Python基础(25)socket模块是单进程的,只能接受一个客户端的连接和请求,只有当该客户端断开的之后才能再接受来自其他客户端的连接和请求.当然我 们也可以通过python的多线程等模块自己写一个可以同时接收多个客户端连接和请求的socket.但是这完全没有必要,因为python标准库已经为 我们内置了一个多线程的socket模块socketserver,我们直接调用就可以了,完全没有必要重复造轮子. 我们只需简单改造一下之前的sock

Python之路_Day11

Python之路_Day11_课堂笔记 前期回顾 本节摘要 一.多线程 基本使用 生产者消费者模型(队列) 自定义线程池 二.多进程 基本使用 进程池 三.协程 greenlet gevent 四.缓存 memcache redis 五.rabbitMQ 六.下节预告: MySQL ORM框架-sqlchemy 堡垒机 一.线程 创建线程的两种基本使用方法: #!/usr/bin/env python # -.- coding: utf-8 -.- # By sandler import thr

哗啦啦Python之路 - 线程,进程,协程

1. 线程锁 如果不控制多个线程对同一资源进行访问的话,会对数据造成破坏,使得线程运行的结果不可预期.因此要引进线程锁. 线程同步能够保证多个线程安全访问竞争资源,最简单的同步机制是引入互斥锁. 互斥锁为资源引入一个状态:锁定/非锁定.某个线程要更改共享数据时,先将其锁定,此时资源的状态为“锁定”,其他线程不能更改:直到该线程释放资源,将 资源的状态变成“非锁定”,其他的线程才能再次锁定该资源.互斥锁保证了每次只有一个线程进行写入操作,从而保证了多线程情况下数据的正确性. 未引入锁前: impo

小白的Python之路 day1

Python之路,Day1 - Python基础1 本节内容 Python介绍 发展史 Python 2 or 3? 一. Python介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承. 最新的TIOBE排行榜(2017,11月的),Python赶超c#占据第四, Python崇尚优美.清晰.简单,是一个优秀并广泛使用的语言. 由上图可见,Pyth

Python之路【第十六篇】:Python并发编程

一.进程和线程 进程 假如有两个程序A和B,程序A在执行到一半的过程中,需要读取大量的数据输入(I/O操作), 而此时CPU只能静静地等待任务A读取完数据才能继续执行,这样就白白浪费了CPU资源. 是不是在程序A读取数据的过程中,让程序B去执行,当程序A读取完数据之后,让 程序B暂停,然后让程序A继续执行? 当然没问题,但这里有一个关键词:切换 既然是切换,那么这就涉及到了状态的保存,状态的恢复,加上程序A与程序B所需要的系统资 源(内存,硬盘,键盘等等)是不一样的.自然而然的就需要有一个东西去