iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >python多线程开发
  • 713
分享到

python多线程开发

多线程python 2023-01-31 05:01:06 713人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

python的线程开发使用标准库threadingThread类def  __init__(self,group=None,target=None,name=None,args(),kwargs=None,*,daemon=None)   

python线程开发使用标准库threading

Thread类

def  __init__(self,group=None,target=None,name=None,args(),kwargs=None,*,daemon=None)
        参数名                     含义
        target线程调用的对象,就是目标函数
        name为线程起的名字
        args为目标函数传递实参,元组
       kwargs为目标函数传递关键字参数,字典


线程启动

import threading 

def worker():
    print("I'm working! wait a moment")
    
t=threading.Thread(target=worker,name='worker')   # 线程对象
t.start().                                        # 启动

       通过threading.Thread创建一个线程对象,target是目标函数,name可以指定自己喜欢的名字,线程的启动需要借助start方法。线程执行函数,是因为线程中就是执行代码的,最简单的封装就是函数,所以本质还是函数调用。

线程退出

Python没有提供线程的退出方法,线程在下面的情况下时会退出

    1. 线程函数内语句执行完毕

    2. 线程函数中抛出未处理的异常

import  threading 
import  time 

def worker( ):
  count=0
  while True:
      if(count>5):
        raise RuntimeError(count)
      time.sleep(1)
    print("I'm  working!")
    count+=1
        
t=threading.Thread(target=worker,name="worker")
t.start( )
print("===End===")

结果如图所示:

image.png

Python的线程没有优先级,没有线程组的概念。


线程的传参

import   threading 
import   time 

def add(x,y):
    print("{} + {} = {}".fORMat(x,y,x+y))
    
t1=threading.Thread(target=add,name="add",args(4,5))
t1.start()
time.sleep(2)

t2=threading.Thread(target=add,name="add",kwargs={"x":4;"y":5})
t2.start()
time.sleep(2)

t3=threading.Thread(target=add,name="add",args=(4,),kwargs={"y":5})
t3.start()

线程传参和函数传参没什么区别,本质上就是函数传参。


threading的属性和方法


              名称                         含义
    current_thread( )返回当前线程对象
    main_thread( )返回主线程对象
    active_count( )当前处于alive状态的线程个数
    enumerate( )返回所有活着的线程的列表,不包括已经终止的线程和未开始的线程
    get_ident( )返回当前线程的ID,非0整数


import   threading
import   time 

def showthreadinfo():
  print("currentthread = {}".format(threading.current_thread()))
  print("main thread = {}".format(threading.main_thread()))
  print("active count = {}".format(threading.active_count()))
    
def worker():
  count=0
  showthreadinfo()
  while True:
      if(count>5):
          break
      time.sleep(1)
    count+=1
    print("I'm working")
        
t=threading.Thread(target=worker,name='worker')
t.start()
print('===End===')

结果如图所示:

image.png

Thread实例的属性和方法


名称含义
name只是一个名字,可以重新命名。getName(),setName()获取,设置这个名词
ident线程ID,它是非0整数,线程启动后才会有ID,线程退出,仍可以访问,可重复使用
is_alive()返回线程是否存活


多线程

一个进程中如果有多个线程,就是多线程,实现一种并发

import   threading
import   time 

def worker():
  count=0
  while True:
      if(count>5):
        break
    time.sleep(0.5)
    count+=1
    print("worker running")
    print(threading.current_thread().name,threading.current_thread().ident)
 
t1=threading.Thread(name="worker1",target=worker)
t2=threading.Thread(name="worker2",target=worker)
 
t1.start()
t2.start()

结果如图所示:

image.png

可以看到worker1和worker2交替执行


daemon线程和non-daemon线程

进程靠线程执行代码,至少有一个主线程,其它的线程都是工作线程。

父线程:如果线程A中启动了一个线程B,A就是B的父线程。

子线程:B就是A的子线程。


       Python中,构造线程的时候,可以设置daemon属性,这个属性必须在start方法之前设置好。线程daemon属性,如果设定就是用户的设置,否则就取当前线程的daemon值,主线程是non-daemon线程,即daemon=False

import time 
import threading 

def foo():
    time.sleep(3)
  for i in range(10):
      print(i)
        
t=threading.Thread(target=foo,daemon=False)
t.start()
print("Main Thread Exiting")

运行结果如图所示:

image.png

        主进程已经执行完毕,但是线程t依然在运行,主进程一直等待着线程t。当将Thread中daemon=False改为True时发现,主进程执行后立即会结束,根本不会等待t线程。


名称含义
daemon属性表示线程是否是daemon线程,这个值必须在start之前设置,否则引发RuntimeError异常
isDaemon是否是Daemon线程
setDaemon设置为daemon线程,必须在start方法之前设置

总结

       线程具有一个daemon属性,可以设置主进程结束后是否等待其他的子线程,如果不设置,取默认值None。从主线程创建的所有线程的不设置daemon属性,则默认daemon=False。


join方法

import   time 
import   threading

def foo(n):
    for i in range(10):
        print(i)
        time.sleep(1)
       
t1=threading.Thread(target=foo,args=(10,),daemon=True)
t1.start()
t1.join()

执行结果如图所示:

image.png

      根据上面讲述的daemon线程,主进程设置的dameon=True,按理说主线程执行是根本不会去等待其它的线程,也就是不会打印这些数字,但是这里却等待了子线程的运行打印出来了,这个就是join方法的作用。

       join(timeout=None),是线程标准方法之一,一个线程中调用另一个线程的join方法,调用者将被阻塞,直到被调用的线程停止。一个线程可以被join多次,timeout是设置等待调用者多久,如果没有设置,就一直等待,直到被调用者线程结束。


threading.local类

      Python提供了threading.local类,将这个类实例化得到一个全局对象,但是不同的线程使用这个对象存储的数据其他线程是不可见的。

import  threading
import  time 

#全局对象
global_data=threading.local()

def worker():
    global_data=0
    for i in range(100):
        time.sleep(0.001)
        global_data+=1
    print(threading.current_thread(),global_data)
    
for i  in range(10):
    threading.Thread(target=worker).start()

运行结果如图所示:

image.png

     可以看到虽然是全局变量,但是这个变量在各个线程之间是独立的,每个的计算结果不会对其他线程造成干扰。


     怎么证明这个是在各个线程之间独立的呢?

import   threading 

TestData="abc"
TestLocal=threading.local()
TestLocal.x=123

print(TestData,type(TestLocal),TestLocal.x)

def worker():
    print(TestData)
    print(TestLocal)
    print(TestLocal.x)
    
worker()
print("=====")
threading.Thread(target=worker).start()

可以看下运行结果

image.png

       在子线程里面打印TestLocal.x时候出错,显示AttributeError: "_thread._local_" object has no attribute 'x',这是因为TestLocal.x我们是在主线程里面定义的,启动一个子线程我们并没有这个属性,所以报错,从而说明threading.local定义的变量,在各个线程之间是独立的,不能跨线程。

       threading.local类构建了一个大字典,其元素是每一线程实例的地址为key和线程对象引用线程单独的字典的映射:

                              {id(Thread) ->  (ref(Thread), thread-local dict)}

    

 定时器Timer

       threading.Timer继承自Thread,用来定义多久执行一个函数。

class  threading.Timer(interval,function,args=None,kwargs=None)

       start方法执行之后,Timer对象会等待interval时间,然后开始执行function函数,如果在等待阶段,使用了cancal方法,就会跳过执行而结束

import   threading 
import   time 

def worker():
    print("in worker")
    time.sleep(2)
    
t=threading.Timer(5,worker)
t.start()
print(threading.enumerate())
t.cancel()
time.sleep(1)
print(threading.enumerate())

image.png

可以看到,延迟5s执行worker线程,然后主线程继续执行,打印存活的线程,就是主线程和worker线程,然后执行cancel,子线程就会被取消执行,sleep 1s后打印存活的线程就只有主线程。


--结束END--

本文标题: python多线程开发

本文链接: https://www.lsjlt.com/news/188070.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • python多线程开发
    Python的线程开发使用标准库threadingThread类def  __init__(self,group=None,target=None,name=None,args(),kwargs=None,*,daemon=None)   ...
    99+
    2023-01-31
    多线程 python
  • Python 多进程开发与多线程开发
    我们先来了解什么是进程?程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程。程序和进程的区别就在于:程序是指令的集合,它是进程运行的静态描述文本;进程是程序的一次执行活动,属于动态概念。在多道...
    99+
    2023-01-31
    多线程 进程 Python
  • Python多线程与高并发
    主要讲解了关于Python多线程的一些例子和高并发的一些应用场景# -*- coding: utf-8 -*- # @Author: Clarence...
    99+
    2023-01-31
    多线程 Python
  • python怎么开启多线程
    要开启python中的多线程:创建线程对象,指定要执行的任务和参数。启动线程,使其开始执行目标函数。根据需要,使用join()方法等待线程完成。 如何在 Python 中开启多线程 多...
    99+
    2024-05-14
    python
  • PHP中的多线程和协程开发
    随着网络应用的不断发展和整个计算机应用的崛起,针对并发问题的解决方案也不断地发展和壮大。在使用PHP进行应用程序开发时,PHP中也提供了多线程和协程的开发方式来帮助程序员解决并发处理问题,本文将介绍PHP中的多线程和协程开发。一、PHP多线...
    99+
    2023-05-24
    PHP 多线程 协程。
  • python并发编程之多线程编程
    一、threading模块介绍 multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性,因而不再详细介绍 二、开启线程的两种方式 方式一: from threading import ...
    99+
    2023-01-31
    之多 线程 python
  • 简单的python多线程并发
    前些天学到的线程,做下记录,以备后用: 程序如下: import sys,time import thread def a():        for i in range(1,5):      ...
    99+
    2023-01-31
    多线程 简单 python
  • python 并发执行之多线程
        正常情况下,我们在启动一个程序的时候。这个程序会先启动一个进程,启动之后这个进程会拉起来一个线程。这个线程再去处理事务。也就是说真正干活的是线程,进程这玩意只负责向系统要内存,要资源但是进程自己是不干活的。默认情况下只有一个进程只会...
    99+
    2023-01-31
    之多 线程 python
  • VB.NET开发多线程详细讲解
    这篇文章主要介绍“VB.NET开发多线程详细讲解”,在日常操作中,相信很多人在VB.NET开发多线程详细讲解问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”VB.NET开发多线程详细讲解”的疑惑有所帮助!接下来...
    99+
    2023-06-17
  • C#多线程开发实战记录之线程基础
    目录前言线程基础 1、创建线程2、暂停线程3、线程等待4、线程终止C#中的lock关键字总结前言 最近由于工作的需要,一直在使用C#的多线程进行开发,其中也遇到了很多问题,但也都解决...
    99+
    2024-04-02
  • Python CPython 的并发和多线程编程
    1. Python CPython中的并发编程 并发编程是一种编程范式,允许在同一时间内执行多个任务。在Python CPython中,并发编程主要通过两种方式实现:多线程和协程。 2. 多线程编程 多线程编程是使用多个线程来同时执行不...
    99+
    2024-03-04
    并发编程 多线程 CPython Python 协程
  • PHP开发中的多线程编程和并发处理
    php的多线程编程和并发处理提供了以下技术:创建线程(pthread_create())并等待其完成(pthread_join())。通过互斥锁(pthread_mutex_lock()...
    99+
    2024-05-09
    php 并发处理 并发请求
  • java多线程开发ScheduledExecutorService简化方式
    目录前言java多线程的应用场景应用场景一:应用场景二:ScheduledExecutorService方法简介实例实例结果 前言 java开发,多多少少会接触到多线程的应用开发场景...
    99+
    2024-04-02
  • Python 多线程
      文章来源:https://www.runoob.com/python/python-multithreading.html 多线程类似于同时执行多个不同程序,多线程运行有如下优点: 使用线程可以把占据长时间的程序中的...
    99+
    2023-01-31
    多线程 Python
  • python多线程————3、多线程间通
    1、共享变量 #通过共享变量 import time import threading url_list = [] def get_detail_html(): global url_list while True: ...
    99+
    2023-01-31
    多线程 python
  • python—多线程
    一、多线程实例  线程时应用程序中工作的最小单位,python中提供了threading模块来对多线程操作,一般多核cpu采用多进程方式,单核才采用多线程方式  方法:  将要执行的方法threading.Thread作为参数传给构造方法(...
    99+
    2023-01-31
    多线程 python
  • python多线程
    Python 多线程 多线程类似于同时执行多个不同程序,多线程运行有如下优点: 使用线程可以把占据长时间的程序中的任务放到后台去处理。 用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的...
    99+
    2023-01-30
    多线程 python
  • Python多线程编程,线程锁
    多线程threading 模块创建线程创建自己的线程类线程通信线程同步互斥方法线程锁@需要了解!!!   什么是线程? 线程也是一种多任务的编程方法,可以利用计算机多核资源完成程序的并发运行。 线程又被称为轻量级进程 ...
    99+
    2023-01-30
    线程 多线程 Python
  • Python开发注意事项:处理多线程和多进程时的注意事项
    Python开发注意事项:处理多线程和多进程时的注意事项在Python开发过程中,使用多线程和多进程可以充分利用计算机的多核处理能力,提高程序的效率和性能。然而,使用多线程和多进程也会带来一些潜在的问题和挑战,开发者需要注意一些注意事项来确...
    99+
    2023-11-22
    gil Concurrency Locks
  • python多线程socket编程--多
    Python中实现socket通信的服务端比较复杂,而客户端非常简单,所以客户端基本上都是用sockct模块实现,而服务 端用有很多模块可以使用,如下: 1、客户端 #!/usr/bin/env python #coding...
    99+
    2023-01-31
    多线程 python socket
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作