Day15:多线程编程

alt

链接点击订阅

在上一节中,我们学习了 Python 的内置函数,包括类型转换、数学计算、序列操作、输入输出和其他常用函数。这些函数在实际的编程中经常使用,灵活掌握函数的使用,能够帮助我们快速完成编程,“给我一个Python库,总有一个函数能够实现你的需求”。在本节中,我们将探讨 Python 中的多线程编程。

1. 多线程编程

多线程是一种并发编程的方式,允许我们在一个程序中同时执行多个线程,提高程序的效率和响应性。

在 Python 中,我们可以使用 threading 模块来创建和管理线程。下面是一个简单的多线程示例:

import threading
import time

def worker():
    print("Worker thread started")

    # 执行一些耗时操作
    for i in range(5):
        print("Working...")
        time.sleep(1) #模拟等待1s
    
    print("Worker thread finished")

print("Main thread started")
thread = threading.Thread(target=worker)
thread.start()

# 主线程继续执行其他操作
for i in range(3):
    print("Main thread working...")

# 等待工作线程执行完毕
thread.join()

print("Main thread finished")

在上面的示例中,我们创建了一个工作线程 worker,并使用 threading.Thread 类将其封装成线程对象。通过调用线程对象的 start() 方法,我们启动了工作线程的执行。同时,主线程继续执行其他操作。最后,我们使用 join() 方法等待工作线程执行完毕。执行结果如下所示:

Main thread started
Worker thread started
Working...
Main thread working...
Main thread working...
Main thread working...
Working...
Working...
Working...
Working...
Worker thread finished
Main thread finished

我们可以发现工作线程 worker中有等待的代码,此时主线程没有等待工作线程结束,而是继续执行自己的代码,然后才回到了工作线程。

3. 线程同步与互斥锁

在多线程编程中,当多个线程同时访问共享资源时,可能会引发数据竞争和不一致的问题。为了解决这个问题,我们需要使用线程同步机制来确保线程间的顺序和互斥性。

在 Python 中,我们可以使用互斥锁(Lock)来实现线程的互斥访问。下面是一个使用互斥锁的示例:

import threading

# 创建一个互斥锁
lock = thread

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

大模型-AI小册 文章被收录于专栏

1. AI爱好者,爱搞事的 2. 想要掌握第二门语言的Javaer或者golanger 3. 决定考计算机领域研究生,给实验室搬砖的uu,强烈建议你花时间学完这个,后续搬砖比较猛 4. 任何对编程感兴趣的,且愿意掌握一门技能的人

全部评论
我为什么输出了500000
点赞 回复 分享
发布于 2023-07-14 14:56 上海

相关推荐

05-27 20:40
已编辑
天津师范大学 Java
点赞 评论 收藏
分享
1. 自我介绍2. 项目都是自己写的吗?3. 我看你用 koa2 写后端,为什么选择它,能讲讲吗?4. 那你提到 koa2 它是不提供中间件的,你是怎么解决的?5. 中间件的原理是什么?(洋葱模型)6. 你刚刚说碰到 next() 就进入下一个中间件,那 next 只能执行同步,如果是异步的话,你是怎么处理的?(async/await,但是我发现,有的中间件需要在异步中间件之前执行,所以我用 try/catch 来处理异步中间件的异常)7. JS 异步发展史,以及它们的优缺点说一下 (回调函数--Promise--Generator--async/await)8. 你刚刚说 Promise 状态不能更改,那如果我要设计一个能修改 Promise 状态的函数,你会怎么设计?9. CSS 水平垂直居中的方法(flex、grid、绝对定位 + margin:auto、绝对定位 + 负 margin、绝对定位 + transform、table-cell)10. 你刚刚说到 flex 布局,那 flex:1 是什么意思?(flex: flex-grow  flex-shrink  flex-basis;等价 flex:1 1 0%表示元素可以均分剩余空间,可拉伸、可压缩,不依赖内容宽度,自动自适应填充布局。)11. 父容器宽是 500px,然后它左右各有两个子容器是 100px,如果设置 flex: 1,那它的宽度是多少?(500-100-100=300px)12. 说说你对浏览器缓存的理解(强缓存、协商缓存)13. 如果一个用户,他怎么去刷新都无法刷到最新版的代码,你能说下可能的原因吗?(版本号、hash等)还有吗?(我说我不知道了,面试官说还有 CDN 没有同步,我说企业才会这么干,自己写项目一般不会,我知道 cdn 是用来解决高并发的手段)14. React你熟吗?说下 React 函数组件和类组件的区别15. 怎么避免 Hooks 导致组件重新渲染?(使用 useCallback、useMemo、React.memo、useRef等等)16. 谈一下我对 React 的状态管理的理解(Redux、Mobx、Zustand,我说 Zustand 用的最多)17. React 常见的 hooks 有哪些?(useState、useEffect、useRef、useCallback、useMemo、useReducer、useContext、useImperativeHandle、useLayoutEffect、useDebugValue)18. TS 你熟吗?我们引进 TS 的目的是为什么?19. interface 和 type 的区别20. 说下 TS 里的泛型21. 我现在有十个字段,比如十个字段就要 A B C D E F G 这种。那我现在另有另外一个方法,这个方法接受的参数呢,必须是这个 interface A 里面的这个 K。就比如说你可以是 A B C 可以 A B C D 任何组合都可以,但是必须是这个 interface 里面的 A 里面的定义的。这个 K 这种类型的话是怎么去定义呢?(说实话我有点不太理解啥意思,反正我说了 keyof)``` TypeScriptinterface Obj {A: stringB: stringC: stringD: stringE: string// 其他字段...}```22. vite 用过吗?说说和 webpack 的区别。vite 的优缺点是什么23. 说说 Tree shaking(树摇) 和 Code Splitting (代码分割)的区别24. Git 你熟吗?说说 git merge 和 git rebase 的区别,什么时候用 git merge,什么时候用 git rebase?25. web3 你熟吗?(不太熟,听说过而已)26. 我看你自我介绍说了 AI,你是怎么用的?27. 除了提示词,还有什么能让 AI 更聪明?28. AI 的优缺点你说一下29. AI 发展这么快,你觉得我们以后会扮演什么角色?30. 反问基本都答上来了。面了我80分钟,我还以为稳过的
查看29道真题和解析
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务