我可以从Python中的线程导入模块吗?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了我可以从Python中的线程导入模块吗?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2174字,纯文字阅读大概需要4分钟。
内容图文
![我可以从Python中的线程导入模块吗?](/upload/InfoBanner/zyjiaocheng/685/488c3221fae04fc2a45095696e403d11.jpg)
一切从昨晚开始,当时我正在编写一个脚本,该脚本需要8个左右的包,其中包括pygame.mixer,在我的计算机上导入该脚本需要几秒钟.
这意味着在脚本开始之前,我必须等待10秒钟左右才能加载所有导入.因为我希望脚本明显地尽可能快,所以我可以开始运行脚本,同时通过以下方式获取导入:
import threading
def import_modules():
import tkinter as tk
from pygame import mixer
import json
import webbrowser
print('imports finished')
a = threading.Thread(target=import_modules)
a.start()
for i in range(10000):
print('Getting Modules')
所以我的问题是:
这被认为是不好的做法,会引起问题吗?
如果可以,我可以使用其他替代方法吗?
还是可以这样做?
解决方法:
如果您使用的是CPython,则可能无法获得预期的改进.
CPython具有全局解释器锁(“ GIL”),可确保一次仅一个线程可以执行Python字节码.
因此,每当导入线程正在执行Python代码时,另一个线程就不会运行.例如,GIL由线程释放.等待I / O.因此,这样可以节省一些时间.
关于tkinter是否真正是线程安全的,存在意见分歧.仍然认为在原始线程中运行tkinter主循环,并且不调用其他线程的tkinter调用是明智的,因为这可能导致崩溃.
GIL也可能导致GUI程序出现问题.如果将第二个线程用于长时间运行的计算,则用户界面的响应速度可能会降低.至少有两种可能的解决方案.第一个是将长时间运行的计算分成小块,每个小块均由after方法执行.第二个是在不同的过程中运行计算.
评论中的后续问题:
is there anything else to speed up execution time?
您必须做的第一件事是测量.到底是什么引起了问题.然后,您可以调查问题区域并尝试改善它们.
例如模块加载时间.在profiler下运行您的应用,以查看模块加载需要多长时间以及原因.
如果pygame.mixer加载时间太长,则可以使用平台的本机混合器.类似UNIX的操作系统通常具有/ dev / mixer设备,而ms-windows具有不同的API.使用这些绝对不会花费10秒.
有一个与此相关的成本:您将失去操作系统之间的可移植性.
What are the alternatives
使用多核是尝试加快速度的通常策略.当前,在CPython上,使代码在多个内核上并行运行的唯一通用方法是使用multiprocessing或current.futures.
但是,此策略是否有效取决于您问题的性质.
如果您的问题涉及对大量数据进行相同的计算,则相对容易并行化.在那种情况下,您可以期望最大的加速速度大致等于您使用的内核数.
您的问题可能包括多个步骤,每个步骤都取决于上一步的结果.这些问题本质上是串行的,很难并行执行.
其他加快速度的方法可能是使用另一个Python实现,例如Pypy.或者您可以将cython与类型提示一起使用,以将对性能至关重要的部分转换为已编译的C代码.
内容总结
以上是互联网集市为您收集整理的我可以从Python中的线程导入模块吗?全部内容,希望文章能够帮你解决我可以从Python中的线程导入模块吗?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。