Python3多线程学习

一、简单实现多线程的方法

使用继承的方式实现多线程

import threading


class myTread(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
    def run(self):
        pass

if __name__ == '__main__':
    mythread = myTread()
    mythread.start()

二、配合queue多线程实现同步

实现打印10000000个数字的方式对单线程和多线程进行对比,实现代码如下

import threading
import queue
import time

class myTread(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
    def run(self):
        while not q.empty():
            print(q.get_nowait()) #从队列中取数据,并打印输出
            q.task_done()         #判断单条get是否取完毕


if __name__ == '__main__':
    q = queue.Queue()
    #先把数据放入队列中
    for i in range(1000000):
        q.put(i)
    #设置开始时间
    start_time = time.time()
    for i in range(7):
        t1 = myTread()
        t1.start()

    q.join() #判断队列是否已经取完,没取完之前就会就行线程堵塞
    end_time = time.time()
    # print('时间:{}'.format((end_time - start_time)))  #计算程序运行时间
    print(f'时间:{end_time - start_time}')

单线程运行时间:

多线程运行时间,这个我开7个线程:

发现反而是单线程的执行效率比多线程的快好多。

Python中对GIL的理解:

Python是解释型语言,那么它在运行的时候就需要解释器了,简单描述下GIL,即global interpreter lock,全局解释器锁,就是python在运行的时候会锁定解释器,就是说在运行的时候只能是一个线程,锁死了,切换不了;每个线程在运行之前都要申请GIL,那么就必须要等上一个线程释放这把锁你才可以申请到,然后执行代码,执行完后,你再交给下一个线程,让它去执行代码,所以多线程会频繁的竞争得到GIL,固然要比单线程的时间多,过程如下:

  设置GIL -> 切换到一个线程去执行 -> 运行 -> 把线程设置为睡眠状态 -> 解锁GIL

总结

Python的多线可以大幅提高代码的效力,但是对于人工智能来说就不太适合了,所以数据领域没有多线程提高效率之说,只有将CPU提升到GPU,TPU来提升计算能力。

Python多现实适合于IO密集型任务:

比如爬虫,当向服务器发送请求的时候,要等服务器响应返回数据,程序才会释放GIL锁,进程才会往下执行,如果是单线程的话,每一次请求都要等待前面的进程访问时间,每次请求服务器返回的数据时间都不一样,如果每次请求都要排队等待的话,反而时间会更长,那么单线程显而易见反而效力底下,如果多线程的话就是实现并发请求,反而效力更高

参考博客:

Python3 多线程为啥比单线程优秀_奋力的小白的博客-CSDN博客

python多线程比单线程效率低_多线程比单线程快,是真的吗?_weixin_39800971的博客-CSDN博客

三、Python实现线程池

Python简单实现线程池代码如下所示


import queue
from concurrent.futures import ThreadPoolExecutor, as_completed

q = queue.Queue()
data_list = [1,2,3,4,5,6,7,8,9,10]
for i in data_list:
    q.put(i)

# 开启线程池 max_workers表示支持的最大线程数
with ThreadPoolExecutor(max_workers=17) as t:
    relt_list = []
    while not q.empty():
        agrs = q.get()
        rest = t.submit(g_t_main, agrs)
        q.task_done()
        relt_list.append(rest)
    # 判断单个线程是否执行完毕
    for future in as_completed(relt_list):
        data = future.result()
        print(f"main: {data}")

线程池可以有效的防住线程堵塞和资源竞争问题,优化线程池使用代码如下所示

import concurrent.futures
import queue
from concurrent.futures import ThreadPoolExecutor, as_completed

q = queue.Queue()
data_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
for i in data_list:
    q.put(i)


def g_t_main(s):
    return s

# 开启线程池 max_workers表示支持的最大线程数
with ThreadPoolExecutor(max_workers=3) as t:
    all_task = []
    while not q.empty():
        all_task.append(t.submit(g_t_main, q.get()))
    concurrent.futures.wait(all_task)
    # 判断整个线程是否执行完毕
    for future in as_completed(all_task):
        data = future.result()
        print(f"main: {data}")

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Python多线程是一种并发编程技术,可以同时执行多个线程,以提高程序的运行效率。在Python中,可以使用`threading`模块来实现多线程。 下面是一个简单的Python多线程示例: ```python import threading def worker(): print("Worker is running") # 创建线程对象 thread1 = threading.Thread(target=worker) thread2 = threading.Thread(target=worker) # 启动线程 thread1.start() thread2.start() # 等待所有线程结束 thread1.join() thread2.join() ``` 在上面的示例中,我们定义了一个`worker`函数,它会在控制台输出一条消息。然后我们创建了两个线程对象,并使用`start()`方法启动它们。最后,我们使用`join()`方法等待所有线程结束。 需要注意的是,多线程Python中并不一定能够实现真正的并行执行,因为Python的GIL(全局解释器锁)机制限制了多线程的执行效率。这意味着即使在多个线程中同时执行相同的代码,也只有一个线程可以获得CPU资源进行执行。但是,Python多线程对于某些特定的任务仍然是非常有用的,例如I/O密集型任务或者使用多核CPU的系统。 在Python学习多线程时,需要了解以下几点: 1. 线程的创建和启动:需要使用`Thread`类来创建线程对象,并使用`start()`方法来启动线程。 2. 线程的同步:由于GIL机制的存在,Python多线程并不能实现真正的并行执行。因此,需要使用锁、条件变量等机制来保证线程之间的同步和通信。 3. 线程池:可以使用线程池来管理多个线程,以提高程序的运行效率。Python中的`queue`模块提供了线程安全的队列,可以用于实现线程池。 4. 多进程:如果需要更高效的并发编程,可以使用Python的多进程模块`multiprocessing`。它可以更好地利用多核CPU的优势,并避免GIL的影响。 5. 锁的使用:在使用多线程时,需要使用锁来保证线程之间的同步和通信。需要注意避免死锁和竞争条件等问题。 6. 死锁问题:死锁是线程之间相互等待资源导致的问题,可以通过适当的调度策略和使用锁来避免死锁问题的发生。 7. 多线程的优点和缺点:多线程适用于I/O密集型任务和需要并发执行的任务。但是,它也存在一些缺点,如性能开销、资源竞争等问题。需要根据具体的应用场景来选择是否使用多线程。 总之,Python多线程是一种重要的并发编程技术,可以用于提高程序的运行效率。在学习Python多线程时,需要了解其基本原理和常见问题,并根据具体的应用场景来选择是否使用多线程

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冒险岛_0_

您的打赏是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值