精华内容
下载资源
问答
  • Python异步多线程--concurrent.futures模块

    千次阅读 2019-05-15 17:35:01
    最近一直在解决python异步多线程,之前项目用的是异步框架celery,但是celery是单线程的,执行效率比较低;后来又使用了多线程threading模块的多线程,但由于GIL的存在,并不是真正的多线程;后来发现了concurrent...

    最近一直在解决python的异步多线程,之前项目用的是异步框架celery,但是celery运行,效率比较低,而且有时候会莫名奇妙的卡死,导致任务堵塞,必须重新启动celery,很麻烦,估计也是我研究的不够深;后来又使用了多线程threading模块的多线程,但由于GIL的存在,并不是真正的多线程;后来发现了concurrent.futures模块中的ThreadPoolExecutor,感觉还可以,大家有需要的可以参看这篇文章Python的线程池

    展开全文
  • asynchronous-parallel-programming:Python中的多线程和多处理异步并行编程
  • 首先python3.9版本终于封装了一个多线程函数 asyncio.to_thread(func, /, *args, **kwargs) #函数直接开线程,传递参数。感觉这才像python 目前3.9以下看来,asyncio多线程实现就是,两个函数: run_in_executor ...

    刚接触异步asyncio,发现python文档一个版本一个变化,恼火。
    东拼西凑终于解决了asyncio的多线程操作,记录下来。对于一个门外汉。太难了。

    首先python3.9版本终于封装了一个多线程函数

    asyncio.to_thread(func, /, *args, **kwargs) #函数直接开线程,传递参数。感觉这才像python
    

    对于3.9版本以下,asyncio多线程实现就是,两个函数:

    run_in_executor 和 run_coroutine_threadsafe
    

    对应两种需求。
    一个是主线程,直接新开线程,运行阻塞函数。方式就像之前写的同步代码一样。代码如下(用到了run_in_executor)

    from concurrent.futures import ThreadPoolExecutor
    import asyncio,time
    
    def zusehanshu():   #测试的阻塞函数
               time.sleep(10)
               threadmingzi()
               return "after 10s"
               
    async def returnfuture(): #测试新建线程
            loop=asyncio.get_event_loop() 
            newexecutor=ThreadPoolExecutor()
            future=await loop.run_in_executor(newexecutor,zusehanshu)#执行阻塞函数
            print(future)
            
    def threadmingzi(): #查看当前线程名字
            import threading
            print("当前线程名字:",threading.current_thread())
            
    asyncio.run(returnfuture())
    
    输出结果:
    当前线程名字: <Thread(ThreadPoolExecutor-0_0, started daemon 3252)>
    after 10s(10s后输出)
    

    上面可以看到,已经新建线程中运行了
    第二种是主线程,直接新开线程,运行项目循环event-loop,推送函数到event-loop,达到多线程运行。(用到了run_coroutine_threadsafe)

    import asyncio,time,threading
    
    async def zusehanshu():   #测试的阻塞函数
            await asyncio.sleep(10)
            threadmingzi()
            
    def threadmingzi(): #查看当前线程名字
            print("当前线程名字:",threading.current_thread())
            
    def startloop(loop): #新建event-loop
            threadmingzi() #看一下线程名字
            asyncio.set_event_loop(loop)
            loop.run_forever()
            
    xinjianloop=asyncio.new_event_loop()
    threading.Thread(target=startloop,args=(xinjianloop,)).start()
    asyncio.run_coroutine_threadsafe(zusehanshu(),xinjianloop)
    
    输出结果:
    当前线程名字: <Thread(Thread-1, started 7672)>
    当前线程名字: <Thread(Thread-1, started 7672)>
    上面可以看到,已经新建线程中运行了
    

    总结:
    asyncio原理就是遍历event-loop获取消息,是一个单线程阻塞函数。
    遍历过程中遇到某个协程阻塞就会卡住,会一直等待结果返回,这时候就需要用到多线程防止阻塞。
    通过上面两个方式,run_in_executor,与同步函数调用相似。用的比较习惯。
    而run_coroutine_threadsafe新线程中建立新event-loop,可以动态添加协程,这个用途自己考虑了。

    展开全文
  • PyQt5中异步刷新UI和Python中的多线程总结 学习python和PyQt5的过程中,做了demo,可以从电脑端向手push文件安装apk的GUIdemo,初学者可从这个例子中学到很多知识。涉及到PyQt5中异步刷新UI+Python中的多线程+...
  • 摘要:https://www.sohu.com/a/341662446_752099
    展开全文
  • PyQt5中异步刷新UI和Python中的多线程总结

    万次阅读 多人点赞 2018-07-09 21:05:42
    Python中的多线程 实现方式一 实现方式二 信号机制 UI刷新 PyQt Pyqt简介 PyQt是Qt的python接口,PyQt的文档较少,但接口函数可以完全参照Qt,继承了Qt中大量的控件以及信号机制,十分方便。以下简介一...

    目前任务需要做一个界面程序,PyQt是非常方便的选择,QT丰富的控件以及python方便的编程。近期遇到界面中执行一些后台任务时界面卡死的情况,解决了在这里记录下。

    PyQt

    PyQt简介

    PyQtQt的python接口,PyQt的文档较少,但接口和函数可以完全参照Qt,继承了Qt中大量的控件以及信号机制,十分方便。以下简介一个基本的PyQt程序。
    - 需要导入的类主要来自三个包
    - from PyQt5.QtWidgets import 常用的控件
    - PyQt5.QtCore 核心功能类,如QTQThreadpyqtSignal
    - PyQt5.QtGui UI类,如QFont
    - 基础的程序结构:

    class Example(QWidget):
        def __init__(self):
            super()__init__()
            self.setupUI()
    
        def setupUI():
            self.show()
            pass
            # 设置UI
    if __name__ == '__main__':
        app = QApplication(sys.argv) # 启动app
        ex = Example()   # 实例化一个自己派生的
        # 也可以实例化库中的控件
        # q = QPushButton()
        # q.show()
        sys.exit(app.exec_())

    总体来说:
    1. 首先实例化APP
    2. 实例化预定义控件或者自己派生自库中的控件,记得调用show()函数
    3. 执行并安全退出

    Python中的多线程

    python中的多线程使用较为方便,主要使用threading.Thread类:
    1. 线程启动使用start()函数
    2. 如果需要等待线程执行使用join,这样主线程会阻塞

    实现方式一

    直接传入函数,启动线程,可以传入参数

    import time, threading
    def threadFunction():
        while True:
            print(11111)
            time.sleep()
    # 用于命名,可以通过threading.current_thread().name获得
    t = threading.Thread(target=threadFunction, name='funciton')
    # 如果线程有参数
    t = threading.Thread(target=threadFunction, args=(), name='funciton')
    t.start()

    实现方式二

    继承Thread,重写run方法

    from threading import Thread
    import time
    
    class Example(Thread):
        def __init__(self):
            super().__init__()
    
        def run(self):
            while True:
                time.sleep(1)
                print(11111111)
    
    if __name__ == '__main__':
        a = Example()
        a.start()
        a.join()
        print(222222222)

    注意:
    1. 使用join方法会让主线程阻塞在这里,等待子线程结束,在里面可以设置阻塞的时间
    2. a.setDaemon(True)start前设置,可以保证在主线程终止时,子线程也终止

    信号机制

    QT中的信号机制能够方便的编写回调。
    1. 很多控件都有预定的信号如clicked,直接使用clicked.connect连接槽函数即可。
    2. 继承自Qt的类,然后自定义一个signal类变量,在实例连接信号就可以了

    class Example(QWidget):
        signal = pyqtSignal()    # 括号里填写信号传递的参数
        # 发射信号
        def func(self):
            self.signal.emit()
    
    # 使用信号
    a = Example()
    a.signal.connect(callback)
    
    # 槽函数
    def callback():
        pass

    UI刷新

    在界面中,通常用会有一些按钮,点击后触发事件,比如去下载一个文件或者做一些操作,这些操作会耗时,如果不能及时结束,主线程将会阻塞,这样界面就会出现未响应的状态,因此必须使用多线程来解决这个问题。
    注意:
    1. PyQt5不能在子线程中刷新线程,这样会造成界面卡死,因此不能使用常规的多线程刷新UI。
    2. 但是又必须要实现子线程和主线程之间的通信,否则无法得知任务是否完成。因此使用PyQt5中的QThread,这样既可以使用信号机制,又能够使用多线程。
    3. 当启动多线程后,注册信号,槽函数为主线程中的函数,当任务完成后,发射信号,在主线程中对UI进行更新。

    注:由于需要注册信号,thread需要是继承自QThread的类

    class Example(QThread):
        signal = pyqtSignal()    # 括号里填写信号传递的参数
        def __init__(self):
            super().__init__()
    
        def __del__(self):
            self.wait()
    
        def run(self):
            # 进行任务操作
            self.signal.emit()    # 发射信号
    
    # UI类中
    def buttonClick(self)
        self.thread = Example()
        self.thread.signal.connect(self.callback)
        self.thread.start()    # 启动线程
    
    def callbakc(self):
        pass

    如有错误,欢迎指正~

    展开全文
  • 主要介绍了Python多线程异步+多进程爬虫实现代码,需要的朋友可以参考下
  • 对于一些需要长时间运行的计算回调,我们可以使用在单线程上运行的异步方法,使用很简单,只需要调用 run_async_function 方法即可,需要注意的是,使用异步命令运行的方法中,不能调用 DearPyGui 的对象与方法。...
  • 虽然标题是“生产者消费者模型实现多线程异步交互”,但这里要说的应该还包括Python的消息队列,因为这里多线程异步交互是通过Python的消息队列来实现的,因此主要内容如下: 1 2 3 4 ...
  • python 异步api ThreadPoolExecutor 、ProcessPoolExecutor(多线程、多进程) python==3.7 线程 import time from concurrent.futures import ThreadPoolExecutor, as_completed from concurrent.futures._base ...
  • 今天小编就为大家分享一篇浅谈PyQt5中异步刷新UI和Python多线程总结,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 目前任务需要做一个界面程序,PyQt是非常方便的选择,QT丰富的控件以及python...
  • python 多线程学习四(并发、并行、同步、异步多线程的区别?) 并发:同一时间段有几个程序都处于已经启动到运行完毕之间,并且这几个程序都在同一个处理机上运行,并发的两种关系是同步互斥; 互斥:进程...
  • 今天小编就为大家分享一篇浅谈PyQt5中异步刷新UI和Python多线程总结,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 本篇文章详细的介绍了python并发编程之多进程、多线程异步和协程,对初学python有一定的了解作用,需要的朋友可以参考下。
  • 上一篇文章主要介绍了多任务场景下单线程异步、多线程、多进程如何选择,链接:多任务场景下单线程异步多线程多进程 这里主要通过三个实例去验证一下简单的多任务场景下,三种方式的耗时情况,假设有10个互不关联的...
  • python爬虫之多线程、多进程爬虫

    万次阅读 多人点赞 2019-05-09 17:22:00
    1.Python多线程并不如java的多线程,其差异在于当python解释器开始执行任务时,受制于GIL(全局解释所),Python 的线程被限制到同一时刻只允许一个程执行这样一个执行模型。 2.Python 的线程更适用于处理 I/O ...
  • Python多线程异步调用

    2021-01-28 16:09:29
      本博客主要实现一个python多线程异步调用的demo。   程序功能简介:调用main_func作为主程序,主程序内部创建两个线程,分别建立线程ID、线程名线程内部执行延迟时间,两个线程内部分别调用函数print_time...
  • 异步爬虫的方式:多进程,多线程(不建议) 好处:可以为相关阻塞的操作单独开启进程或者线程,阻塞操作就可以异步执行(继续执行阻塞的操作之后的代码) 弊端:无法无限制地开启多进程或者多线程 进程池或者线程池...
  • python 彻底解读多线程与多进程

    万次阅读 多人点赞 2019-03-26 14:20:34
    title: 多线程与多进程 ...top: 0 date: 2019-03-03 16:16:41 tags: 多线程多进程 ...description: 对python多线程多进程进一步刨析。 真是这样的话,有些话,只有准确的时间准确的地点亲口说出来。现在时间错...
  • python异步 这是Python中asyncio库的基本概念入门。 如果您来过这里,那么您可能听说过异步,并发并行性之类的词。 在开始使用asyncio之前,让我们快速地(通过示例)正确了解这些词的一些基本知识,以便为此...
  • python异步

    2019-06-24 16:44:49
    python异步 概念: python内置全局锁,限制一个进程只有一个线程被CPU调用 进程、线程、协程 进程:CPU资源分配的最小单元,一个进程可以有线程 计算密集型:效率高,但浪费资源 IO密集型:效率高,...
  • Python异步编程详解

    2021-06-14 22:56:41
    您观看课程学习后 ...了解异步编程的好处在面试中,遇到异步多线程,生成器这些核心问题可以对答如流尝试使用异步编程来优化自己的代码或者搭建异步处理框架在优化项目时候,清楚线程,协程,进程的使用场景
  • 多线程编程一向是难点,也容易出问题。之前c#中异步委托用的很爽,python中如何实现类似效果呢?   上面的流程图中,在接收数据之后,启动一个清洗数据的线程,然后不必等待清洗结果继续接收数据。同样,在清洗...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 54,805
精华内容 21,922
关键字:

python的异步和多线程

python 订阅