为了能更好地理解本文描述的问题和解决方案,首先让我们来看一段代码(左侧)及其运行结果(右侧):
在上面的代码中,使用一个线程每隔1秒钟输出一次当前工作目录,然后在5秒后、8秒后、11秒后分别创建和启动3个新的线程修改当前工作目录,注意第一次修改实际上并没有改变当前工作目录,因为本来就在这个目录中。从结果可以看出,在函数funcChange()对应的线程中修改当前工作目录之后,会影响funcshow()函数对应的线程。
如果使用多进程编程的话,则不会存在这个问题,例如:
那么,这个影响会带来什么问题呢?让我们再看下面的案例,在这个案例中,有ftpServer.py和ftpClient.py两个程序,用来模拟FTP协议的工作原理。在服务器端使用了多线程技术,针对每个客户端创建并启用独立的线程为其服务。
服务端代码:
客户端代码:
这段代码在单客户端在线时表现正常,但是多客户端同时在线时,用户主目录会变得不对,因为在每个客户端对应的线程中执行的os.chdir(home)对所在进程中的所有线程都有效,也就是会影响为其他客户端服务的线程:
结合本文开始两段代码的运行结果可知,上面的代码使用多线程不合适,应该改用多进程,修改后代码如下。
服务端代码,箭头所指处为修改后的代码,省略了中间代码:
客户端代码,红框内是修改后的代码,省略了其他没有改动的代码:
修改后运行结果如图所示: