前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python多线程编程的一个掉进去不太容易爬出来的坑

Python多线程编程的一个掉进去不太容易爬出来的坑

作者头像
Python小屋屋主
发布2019-05-13 16:19:13
1.2K0
发布2019-05-13 16:19:13
举报
文章被收录于专栏:Python小屋

感谢山东工商学院计算机学院数字媒体技术专业16级郝佳驷和谭泽浩两位同学在上课讲的代码中发现并及时提出文中描述的问题。

为了能更好地理解本文描述的问题和解决方案,首先让我们来看一段代码(左侧)及其运行结果(右侧):

在上面的代码中,使用一个线程每隔1秒钟输出一次当前工作目录,然后在5秒后、8秒后、11秒后分别创建和启动3个新的线程修改当前工作目录,注意第一次修改实际上并没有改变当前工作目录,因为本来就在这个目录中。从结果可以看出,在函数funcChange()对应的线程中修改当前工作目录之后,会影响funcshow()函数对应的线程。

如果使用多进程编程的话,则不会存在这个问题,例如:

那么,这个影响会带来什么问题呢?让我们再看下面的案例,在这个案例中,有ftpServer.py和ftpClient.py两个程序,用来模拟FTP协议的工作原理。在服务器端使用了多线程技术,针对每个客户端创建并启用独立的线程为其服务。

服务端代码:

客户端代码:

这段代码在单客户端在线时表现正常,但是多客户端同时在线时,用户主目录会变得不对,因为在每个客户端对应的线程中执行的os.chdir(home)对所在进程中的所有线程都有效,也就是会影响为其他客户端服务的线程:

结合本文开始两段代码的运行结果可知,上面的代码使用多线程不合适,应该改用多进程,修改后代码如下。

服务端代码,箭头所指处为修改后的代码,省略了中间代码:

客户端代码,红框内是修改后的代码,省略了其他没有改动的代码:

修改后运行结果如图所示:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-04-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python小屋 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档