python-46-多线程

前言

线程:单个进程中执行中每个任务就是一个线程。线程是进程中执行运算的最小单位,代码/数据/文件是共享的。

就好像看作一个进程中还有多个线程执行任务,简单点来说就是一个程序运行中有多个线程在执行。

一、初识多线程

1、函数中多线程:

# 初识多线程:threading
from threading import Thread
import time
def func(i):
    time.sleep(2)
    print(i)

if __name__ == ‘__main__‘:
    for i in range(5):
        thread=Thread(target=func,args=(i,))
        thread.start()

2、类中多线程:

# 2、类中多线程
from threading import Thread
import time
class MyTread(Thread):
    def __init__(self,i):
        super().__init__()
        self.i=i
    def run(self):          # 必须有run方法
        time.sleep(1)
        print(self.i)

for i in range(10):
    t=MyTread(i)
    t.start()

线程pid是一样的:

3、代码/数据/文件是共享的:

但变量计算中会可能会同时拿到变量导致数据不安全,但可以加锁(GIL锁)

实例:

# 3、代码/数据/文件是共享的实例
from threading import Thread
import time
num=10                      # 定义一个全局变量
class MyTread(Thread):
    def __init__(self,i):
        super().__init__()
        self.i=i
    def run(self):          # 必须有run方法
        global num          # global声明变量
        time.sleep(1)
        print(‘线程:‘,self.i+num) # i+num
for i in range(10):
    t=MyTread(i)
    t.start()

4、多线程与多进程效率对比,同是100个。

明显多线程更胜一筹,毋庸置疑。

# 4、多线程与多进程效率对比,同是100个。
from threading import Thread
import time
from multiprocessing import Process
def func(i):
    return i+i
if __name__ == ‘__main__‘:
    start=time.time()
    t_lst=[]
    for i in range(100):
        t=Thread(target=func,args=(i,))     # 多线程
        t.start()
        t_lst.append(t)
    for i in t_lst:i.join()
    t1=time.time()-start
    print(‘多线程执行时间:‘,t1)

    start=time.time()
    p_lst=[]
    for i in range(100):
        p=Process(target=func,args=(i,))    # 多进程
        p.start()
        t_lst.append(p)
    for i in p_lst:i.join()
    t2=time.time()-start
    print(‘多进程执行时间:‘,t2)

二、threading 其它方法

  • current_thread:查看线程名字与id
  • get_ident:查看线程id
  • active_count:查看活跃线程数(注意要加上主线程)
  • enumerate:查看线程所有项(len就得到活跃线程数)

1、threading模块其它方法:

# threading模块其它方法
import threading,time
def func(i):
    time.sleep(0.5)
    print(i,threading.current_thread())     # 查看线程名字与id
    print(i,threading.get_ident())          # 查看线程id

for i in range(5):
    threading.Thread(target=func,args=(i,)).start()
print(threading.active_count())             # 查看活跃线程数(注意要加上主线程)
print(threading.enumerate())                # 查看线程所有项
print(threading.current_thread())           # 查看线程名字与id

小结:

  • 进程是最小的内存分配单位,线程是操作系统调度的最小单位
  • 线程直接被CPU执行,进程内至少含有一个线程,也可以开启多个线程
  • 开启一个线程所需要的时间要远远小于开启一个进程
  • 多个线程内部有自己的数据栈,数据不共享,但代码/数据/文件是共享的
  • 全局变量在多个线程之间是共享的,但会导致数据不安全,需加锁

欢迎来大家QQ交流群一起学习:482713805

原文地址:https://www.cnblogs.com/gsxl/p/12591067.html

时间: 2024-10-21 02:11:25

python-46-多线程的相关文章

Python实现多线程HTTP下载器

本文将介绍使用Python编写多线程HTTP下载器,并生成.exe可执行文件. 环境:windows/Linux + Python2.7.x 单线程 在介绍多线程之前首先介绍单线程.编写单线程的思路为: 解析url: 连接web服务器: 构造http请求包: 下载文件. 接下来通过代码进行说明. 解析url 通过用户输入url进行解析.如果解析的路径为空,则赋值为'/':如果端口号为空,则赋值为"80":下载文件的文件名可根据用户的意愿进行更改(输入'y'表示更改,输入其它表示不需要更

python的多线程到底有没有用?

在群里经常听到这样的争执,有人是虚心请教问题,有人就大放厥词因为这个说python辣鸡.而争论的核心无非就是,python的多线程在同一时刻只会有一条线程跑在CPU里面,其他线程都在睡觉.这是真的吗? 是真的.这个就是因为传说中的GIL(全局解释锁)的存在.不明白这个词的可以去百度一下,我解释不好(大家都是程序猿你懂的,我写错一个词就要挨喷了,就算我没写错对方理解错了,我也一样要挨喷).有了这样一个看似bug的存在,就导致了上面说的情况:同一时刻内,python的线程只有一条在CPU里面运行.

python之多线程

声明:示例来源<python核心编程> 前言 单线程处理多个外部输入源的任务只能使用I/O多路复用,如:select,poll,epoll. 特别值得注意的是:由于一个串行程序需要从每个 I/O 终端通道来检查用户的输入,程序在读取 I/O 终端通道时不能阻塞,因为用户输入的到达时间是不确定的,并且阻塞会妨碍其他 I/O 通道的处理. select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责

Python的多线程和多进程模块对比测试

本文主要对比测试Python的多线程和多进程模块在CPU类型和I/O的任务操作时的效率 一 测试CPU消耗类型任务 在一台多核CPU的服务器上执行多线程代码,理论上代码执行时会利用多余的CPU核心来提升性能.但是由于Python的GIL的存在,使用多线程来执行CPU繁重的任务,未必能得到性能提升.但是GIL又必不可少,因为在Python解释器中执行线程是不安全的,也就是说为了保证Python线程执行时的安全,Python提供了一个全局锁,同一时刻,只允许一个线程获得这个全解锁并执行. CPU消耗

自动化测试框架解析2-----关于python的多线程问题

在阅读代码的时候,碰到了python中多线程的问题.在这里做一个记录 mport time  import threading def movie(func): for i in range(2): print "I am watching movie <%s>, time:%s"%(func,time.ctime()) time.sleep(5) def music(func): for i in range(2): print "I am listennig 

Python threading多线程编程示例

Python 的多线程有两种实现方法: 函数,线程类 1.函数 调用 thread 模块中的 start_new_thread() 函数来创建线程,以线程函数的形式告诉线程该做什么 # -*- coding: utf-8 -*- import thread def f(name): #定义线程函数 print "this is " + name if __name__ == '__main__': thread.start_new_thread(f, ("thread1&qu

【python】多线程编程

使用多线程编程和一个共享的数据结构如queue,这种程序任务可以用多个功能单一的线程来组织: UserRequestThread:负责读取客户的输入,可能是一个I/O信道.程序可能创建多个线程,每个客户一个,请求会被放入队列中 RequestProcessor:一个负责从队列中获取并处理请求的线程,它为下面那种线程提供输出 ReplyThread:负责把给用户的输出取出来,如果是网络应用程序就把结果发送出去,否则就保存到本地文件系统或数据库中. 一个顺序执行单线程的例子: from time i

python中多线程调度机制以及GIL

总结下python中线程调度机制. 对于线程调度机制而言,同操作系统的进程调度一样,最关键是要解决两个问题: 1.在何时选择挂起当前线程,并选择处于等待的先一个线程呢? 2.在众多等待的线程中,选择哪一个作为激活线程呢? 在python多线程机制中,这个两个问题是有两个层次解决的. 如,进程间的切换,当发生了时钟中断,操作系统响应时钟中断,并在这个时候开始进程的调度. 同样的,python也是通过软件模拟了这样的时钟中断,来激激活线程的调度. 我们知道,python字节码解释器是按照指令,顺序一

[ Python - 11 ] 多线程及GIL全局锁

1. GIL是什么? 首先需要明确的一点是GIL并不是python的特性, 它是在实现python解析器(Cpython)时所引入的一个概念. 而Cpython是大部分环境下默认的python执行环境,要明确一点:GIL并不是python的特性,python完全可以不依赖于GIL. 2. 为什么会有GIL? 为了更有效的利用多核处理器的性能,就出现了多线程的编程方式,而随之带来的就是线程间数据的一致性和状态同步的完整性 (例如:线程2需要线程1执行完成的结果,然而线程2又比线程1代码量少,线程2

python里多线程的写法

python里多线程的写法 今天用到python多线程的时候, 发现不知道如何正确的等待所有线程结束后再结束主线程. 其实到最后我才知道这都是杞人忧天, Thread()出来的实例本来就是等到主进程结束后才结束. 官方解释: daemon A boolean value indicating whether this thread is a daemon thread (True) or not (False). This must be set before start() is called