首页 > 编程语言 >Python多线程的坑——切换工作目录导致错误

Python多线程的坑——切换工作目录导致错误

时间:2023-03-15 17:11:50浏览次数:38  
标签:__ chdir Python 线程 切换 print 多线程 os 目录

Python多线程的坑——切换工作目录导致错误

复现:

import os
import time
from concurrent.futures import ThreadPoolExecutor


def thread_func(a):
    origin = os.getcwd()
    print(str(a) * 5 + '>>:', origin)
    if a == 1:
        os.chdir('/data/users/fhu/PycharmProjects/Buildflow/tools')
        print('111: %s' % os.getcwd())
    elif a == 2:
        print('222: %s' % os.getcwd())
    print(a)
    os.chdir(origin)


def main():
    pool = ThreadPoolExecutor(20)
    for i in range(0, 2):
        a = i + 1
        pool.submit(thread_func, a)

    pool.shutdown(wait=True)


if __name__ == '__main__':
    main()
  • 多次运行,可能出现了不相同的结果,由于两个线程运行的速度是不确定的,所以会出现不同的结果。
  • 线程1的结果使用没变,但是,线程2的打印结果是变化的

 

原因:

当前工作环境,在线程之间是共享的,所以,在多线程中,如果其中一个线程通过os.chdir()修改了工作目录,那么会出现一定概率,导致其它线程的工作目录也随之改变。

如果线程A切换到新路径工作时,由于工作时间较长,并没有切回到原始路径。而此时,线程B也在工作,他的路径被线程A切换了,导致在错误的路径中工作

 

验证方法:

该方法验证多线程中使用os.chdir()切换工作目录的方式,会影响其它线程的工作目录

import os
import time
from concurrent.futures import ThreadPoolExecutor


def thread_func(a):
    origin = os.getcwd()
    print(str(a) * 5 + '>>:', origin)
    if a == 1:
        os.chdir('/data/users/fhu/PycharmProjects/Buildflow/tools')
        time.sleep(5)
        print('111: %s' % os.getcwd())
    elif a == 2:
        time.sleep(2)
        print('222: %s' % os.getcwd())
    print(a)
    os.chdir(origin)


def main():
    pool = ThreadPoolExecutor(20)
    for i in range(0, 2):
        a = i + 1
        pool.submit(thread_func, a)

    pool.shutdown(wait=True)


if __name__ == '__main__':
    main()
  • 此时,线程2的工作目录永远是因为线程1切换的新目录,不是自己的原始目录。

 

解决:

在多线程中尽量不要使用os.chdir()来进行目录切换,可以用绝对路劲来进行操作。

例如:

  • os路径操作时,使用绝对路径操作,而不是先切换目录,再使用相对路径操作
  • subprocess执行命令时,使用subprocess的cwd参数,来指定工作路径
  • 采用多进程的方式,因为进程间是隔离的,互不影响,但是多进程的资源消耗相对多

标签:__,chdir,Python,线程,切换,print,多线程,os,目录
From: https://www.cnblogs.com/linagcheng/p/17219201.html

相关文章

  • python celery异步发送短信
    前言 Celery易于使用和维护,并且它 不需要配置文件 。 Celery有一个活跃、友好的社区来让你寻求帮助,包括一个 邮件列表 和一个 IRC频道 。倘若连接丢失或失......
  • 大爽Python入门教程 7-8 实践演示* 控制台版本——简易回合战斗
    大爽Python入门公开课教案点击查看教程总目录1背景介绍不知道大家有没有玩过魔塔。在我小时候,这是一个很经典又好玩的小游戏。其实最早想做一个控制台版本的简易魔......
  • 大爽Python入门教程 7-7 异常处理 try ... except Exception
    大爽Python入门公开课教案点击查看教程总目录1什么是异常Exception简单来讲,错误Error就是异常Exception。具体的,我们先来看几个错误。>>>2:3SyntaxError:illega......
  • Python让selenium代码执行完毕不关闭浏览器的方法
    pythonselenium在默认情况下,执行完业务逻辑的时候,浏览器也会进行自动关闭,如何让浏览器能够不退呢?下面给出一种我认为比较简单的解决方案供大家进行参考。用ChromeOption......
  • python文件操作
    一、文件编码 编码技术:翻译的规则,记录了如何将内容翻译成二进制,以及如何将二进制翻译回可识别内容;   计算机中有许多可用编码:UTF-8、GBK、Big5等; UTF-8是目前......
  • Python环境准备
    一、Python解释器的下载安装1、下载下载地址:https://www.python.org/downloads/release/python-364/ 2、安装双击可执行文件,勾选【添加环境变量】,按提示操作安装即可......
  • python实现iOS手机模拟弱网
    一、需求描述有时候在我们测试的时候需要模拟弱网去测试一些异常场景,因此使用python实现了iOS手机模拟弱网的方式。二、模拟方式首先电脑连机ios手机,然后执行如......
  • python 字符串编码
     测试网站1:http://www.msxindl.com/tools/unicode16.asp如 \ud83d\udc15从Unicode还原是一只......
  • Linux系统中多线程实现方法的全面解析
    ​线程引入:     在传统的Unix模型中,当一个进程需要由另一个实体执行某件事时,该进程派生(fork)一个子进程,让子进程去进行处理。Unix下的大多数网络服务器程序都是这么......
  • #Python 计算地理经纬度距离
    一:X-MIND二:计算两点经纬度之间的距离经纬度是利用三维球面空间来描述地球上一个位置的坐标系统,每个经纬度坐标由经度lng和纬度lat两个分量组成。经纬度的有效范围为......