皮皮网

【prp协议源码】【qt导入外部源码】【腾讯wifi码源码】python线程源码_python线程原理

2024-11-23 12:32:44 来源:健康管理源码

1.Python多线程编程之线程创建
2.threading简介(创建多线程的线程线程两种方法)★
3.Python 线程池 (thread pool) 创建及使用 + 实例代码
4.Python内置库:threading(多线程)
5.在Python中获取当前线程的名字
6.python 循环中使用多线程

python线程源码_python线程原理

Python多线程编程之线程创建

       åˆ›å»ºä¸€ä¸ªå¯æ‰§è¡Œçš„线程需要具备线程对象和线程体这2个要素:

       çº¿ç¨‹å¯¹è±¡:即threading模块Thread线程类或其子类所创建的对象;

       çº¿ç¨‹ä½“:即执行函数。

       çº¿ç¨‹ä½“主要有以下两种方式:

       (1)自定义函数作为线程体;

       (2)继承Thread线程类重写run()方法,run()方法作为线程体。

1 自定义函数作为线程体

       çº¿ç¨‹åˆ›å»ºè¯­æ³•å¦‚下:

threading.Thread(target=None,name=None,args=())

       target参数是线程体,自定义函数可以作为线程体。name参数可以设置线程名,如果省略,python解释器会为其分配一个名字。args是为自定义函数提供参数,它是一个元组类型。

       example:

importthreadingimporttimedefthread_body(func):t=threading.current_thread()fornuminrange(5):print(f'第{ num}次执行线程{ t.name}')time.sleep(1)print(f'{ func}环境的线程{ t.name}执行完成!')defmain():t1=threading.Thread(target=thread_body,name='test_thread_',args=('测试',))t1.start()t2=threading.Thread(target=thread_body,name='test_thread_',args=('正式',))t2.start()if__name__=='__main__':main()

       result:

第0次执行线程test_thread_第0次执行线程test_thread_第1次执行线程test_thread_第1次执行线程test_thread_第2次执行线程test_thread_第2次执行线程test_thread_第3次执行线程test_thread_第3次执行线程test_thread_第4次执行线程test_thread_第4次执行线程test_thread_正式环境的线程test_thread_执行完成!测试环境的线程test_thread_执行完成!

       æ³¨ï¼š

       (1)这里解释一下,因为多线程会存在资源竞争的问题,所以导致输出的内容换行会有问题,且每次执行输出换行都 不一样。这个需要加互斥锁进行解决

       (2)从结果来看,两个线程交替进行会有一种两个线程同时进行的错觉。但实际上一台只有一个CPU的电脑在某个特定时刻有且只有一个线程在运行。上述运行结果的产生是我们在程序中通过让当前程序休眠(就是代码中的time.sleep(1))将CPU资源让给其他线程执行的结果。假使我们去掉了time.sleep(1),效果如下:

importthreadingimporttimedefthread_body(func):t=threading.current_thread()fornuminrange(5):print(f'第{ num}次执行线程{ t.name}')#time.sleep(1)print(f'{ func}环境的线程{ t.name}执行完成!')defmain():t1=threading.Thread(target=thread_body,name='test_thread_',args=('测试',))t1.start()t2=threading.Thread(target=thread_body,name='test_thread_',args=('正式',))t2.start()if__name__=='__main__':main()

       result:

第0次执行线程test_thread_第1次执行线程test_thread_第2次执行线程test_thread_第3次执行线程test_thread_第4次执行线程test_thread_测试环境的线程test_thread_执行完成!第0次执行线程test_thread_第1次执行线程test_thread_第2次执行线程test_thread_第3次执行线程test_thread_第4次执行线程test_thread_正式环境的线程test_thread_执行完成!

       å…¶ç»“果完全就是阻塞式的按顺序执行了,即先知先线程1,线程1执行完毕才会执行第二个线程。

2 继承Thread线程类实现线程体

       å¦å¤–一种实现线程体的方式是,创建一个Thread类,并重写run()方法,

       example:

importthreadingimporttimeclassMyThread(threading.Thread):def__init__(self,name=None):super().__init__(name=None)defrun(self):t=threading.current_thread()fornuminrange(5):print(f'第{ num}次执行线程{ t.name}')time.sleep(1)print(f'线程{ t.name}执行完成!')defmain():t1=MyThread()t1.start()t2=MyThread(name='MyThread')t2.start()if__name__=='__main__':main()

       result:

第0次执行线程Thread-1第0次执行线程Thread-2第1次执行线程Thread-2第1次执行线程Thread-1第2次执行线程Thread-2第2次执行线程Thread-1第3次执行线程Thread-2第3次执行线程Thread-1第4次执行线程Thread-2第4次执行线程Thread-1线程Thread-1执行完成!线程Thread-2执行完成!

threading简介(创建多线程的两种方法)★

       一、什么是源码原理threading?

       threading是Python内置的一个创建多线程的库,调用threading库中的线程线程threading.Thread方法来创建线程。

       创建多线程的源码原理基本语法为:threading.Thread(target=函数名, args=(函数参数1,....函数参数n), name='线程名')。

       二、线程线程threading的源码原理prp协议源码使用方法

       1、创建线程的线程线程思路1:先定义函数再用Thread方法创建线程

       定义函数test,函数内部打印当前线程名称和传入的源码原理参数。在main函数中,线程线程创建两个线程t1和t2,源码原理分别调用start()和join()方法启动线程和等待线程结束。线程线程

       输出结果:在指定线程中,源码原理打印出传入的线程线程参数。

       2、源码原理qt导入外部源码创建线程的线程线程思路2:先定义类并在类内部重写run方法,再用Thread方法创建线程

       定义一个继承自threading.Thread的子类test,内部包含特殊方法__init__和run方法。在main函数中,创建类的实例,并调用start()和join()方法启动线程和等待线程结束。

       输出结果:在指定线程中,打印出传入的参数。

Python 线程池 (thread pool) 创建及使用 + 实例代码

       Python中的线程池是处理高并发问题的重要工具,它通过管理一组线程来提高效率,避免频繁创建和销毁线程带来的开销。线程池的基本概念是维护一定数量的线程,等待分配给任务,腾讯wifi码源码确保资源的有效利用。创建线程池的目的是为了在处理大量请求时,控制线程数量,防止资源过度消耗。

       在Python中,可以利用内置的concurrent.futures库中的ThreadPoolExecutor来构建线程池。这个类允许你指定线程池的最大工作线程数,并提供了如submit、result和cancel等方法来管理任务执行。例如,你可以创建一个线程池实例,设置最大线程数为2,然后提交一个任务到线程池中执行。城市停车平台源码

       线程池设计时,关键点包括:预先创建线程数量,任务分发给线程处理,当任务完成后,线程池会自动调度下一个任务。Python的map函数在处理迭代器时,可以并发执行函数,这也是线程池功能的一种体现。

       线程池的实现不仅能提升程序性能,还考虑了线程池的伸缩性和资源管理,确保在处理大量请求时,既能充分利用系统资源,又避免了不必要的燕窝无朔源码线程切换开销。通过合理的线程池设计,可以在Python开发中更有效地应对并发挑战。

Python内置库:threading(多线程)

       Python内置的threading模块提供了丰富的多线程操作功能,包括线程对象、锁对象、递归锁、事件、条件变量、信号量、定时器和栅栏等工具。

       其中,with语句支持那些具有acquire()和release()方法的对象,如Lock、RLock、Condition和Semaphore。例如:

       使用with语句的便利性,如:

       Python3中,虽然方法名和函数名格式统一,但某些方法在Python2.x中仍保留了驼峰命名,如threading.active_count()与threading.activeCount()功能相同。

       程序启动时,会自动创建一个主线程,threading.Thread的实例。active_count()函数会考虑到主线程,例如在程序启动时,其结果会显示为1。

       threading模块还定义了TIMEOUT_MAX,作为阻塞函数如Lock.acquire()的超时限制,防止无限等待。

       threading.Thread类的创建功能有限,不具备优先级和线程组设置,且线程不可销毁或中断。守护线程和非守护线程的特性影响程序退出:守护线程在程序退出时会强制结束,而非守护线程则需所有线程结束才退出。

       以下是一些实例演示:

       通过daemon属性设置守护线程,如:

       锁对象threading.Lock用于同步线程,避免死锁,如:

       递归锁threading.RLock则解决递归获取锁的问题,如:

       条件变量threading.Condition允许线程等待唤醒,如:

       信号量threading.Semaphore控制线程数量,如:

       事件对象threading.Event用于线程间的通信,如:

       定时器threading.Timer用于延迟执行,如:

       栅栏threading.Barrier用于多线程同步,如:

       队列的使用有助于线程间数据传递,如:

       理解多线程和多进程的区别,如进程ID、数据共享和CPU利用,以及线程与进程间的切换和死锁处理。

       最后,信号量与进程池的差异在于控制线程数量和灵活性,如:

在Python中获取当前线程的名字

       多线程编程在Python中通过threading模块得到支持,理解并管理当前执行的线程是这一编程范式中的关键步骤。本篇文章将聚焦在如何获取当前线程的名字,并通过实例代码展示这一功能的实现。

       1. 使用threading模块

       在Python的threading模块中,current_thread()函数可以用来获取当前线程的实例。通过访问这个实例的name属性,可以读取线程的名字。

       示例1:获取主线程的名字

       以下代码展示如何获取主线程的名字:

       通常输出为:

       示例2:获取子线程的名字

       以下示例展示了创建子线程并获取其名字的过程:

       输出将是:

       这里通过创建Thread类的新实例并设置name属性来为子线程命名。

       2. 修改线程的名字

       除了获取线程名字,threading模块还允许修改线程的名字,这可通过设置线程对象的name属性来实现。

       示例3:修改线程的名字

       修改后的输出将是:

       结论

       在Python中,通过使用threading模块的current_thread()函数,可以简便地获取当前线程的实例,并通过其name属性读取或设置线程的名字。这一特性在处理复杂多线程任务时非常有用,有助于提升代码的可读性和维护性。上述代码示例说明了在不同情况下获取和设置线程名字的方法,帮助开发者更有效地管理和调试多线程应用。

python 循环中使用多线程

       import time

       import threading

       def p(*listp):

        for i in range(0,len(listp)):

        print (listp[i])

       p1=[]

       p2=[]

       for i in range(1,):

        if(i%==1):

        p1.append(i)

        elif(i%==2):

        p2.append(i)

       threads=[]

       th1=threading.Thread(target=p,args=(p1))

       threads.append(th1)

       th2=threading.Thread(target=p,args=(p2))

       threads.append(th2)

       if __name__=='__main__':

        for t in threads:

        t.setDaemon(True)

        t.start()