如何在Python中使两个线程同时运行?

如何在Python中使两个线程同时运行?,python,multithreading,Python,Multithreading,我试图使两个函数同时运行。其中一个函数从服务器下载一组文件,另一个函数更改gui中用作进度条的标签文本。执行下载的线程似乎完全阻止了另一个线程运行,直到它完成之后,即使另一个线程是先启动的。代码如下: def getData(statusText): getFiles = threading.Thread(target=mf.getCurrentData) progressDisplay = threading.Thread(target=progressBar, args=(s

我试图使两个函数同时运行。其中一个函数从服务器下载一组文件,另一个函数更改gui中用作进度条的标签文本。执行下载的线程似乎完全阻止了另一个线程运行,直到它完成之后,即使另一个线程是先启动的。代码如下:

def getData(statusText):
    getFiles = threading.Thread(target=mf.getCurrentData)
    progressDisplay = threading.Thread(target=progressBar, args=(statusText,))
    if __name__ == '__main__':
        progressDisplay.start()
        getFiles.start()
编辑:尝试使用多处理时,收到以下错误:PicklingError:无法pickle'tkapp'对象:

编辑2:在尝试了所有让多处理工作起来的方法之后,我似乎觉得这根本不是我的选择。为了让它更新GUI,我必须大量修改现有代码。然而,我不明白为什么线程不起作用。我的程序的另一部分是处理线程,进程运行时间较长,进度条在该实例中占用了大量内存


编辑3:我解决了这个问题。这对我来说真是太愚蠢了。程序中其他地方的循环阻止线程正确运行。我一直使用线程而不是多处理,因为我正在将tkinter对象传递给线程。

尝试使用多处理而不是。。。您之所以看到这一点,是因为无论您如何下载,页面的阻塞级别都低于python。。。GIL阻止python继续。。。另一个选项是在c源代码中释放pythong GIL,如果您只是使用
start()
,则可以下载您正在使用的任何东西,你几乎可以用
多处理.Process
代替
线程.Thread
——Joran说得对,这至少可以缓解GIL问题。这里的多处理问题不错,回答不好:
导入Tkinter;eval(“package require Thread”)
而不是使用本机Tcl线程,它们不会遭受GIL…,只是开玩笑而已。但一般来说,您的代码应该可以工作,即使是在带有GIL的Python中,除非您的C代码在不释放GIL的情况下阻塞。如果使用swig,请尝试
-thread
开关…是否正在获取网页IO绑定?在这种情况下,GIL为什么重要?我不确定progressDisplay做什么,但我怀疑它可以被重写,以满足最低的CPU需求?