当前位置: 首页 > 知识库问答 >
问题:

Python多重处理/线程阻塞主线程

祁驰
2023-03-14

我正在尝试用Python编写一个程序。我想写的是一个脚本,它会立即向用户返回一条友好的消息,但会在后台生成一个长的子进程,它会处理几个不同的文件,并将它们写入一个祖父文件。我已经做了一些关于线程和处理的教程,但我遇到的是,无论我尝试什么,程序都会一直等待,直到子进程完成,然后才会向用户显示前面提到的友好消息。以下是我尝试过的:

线程示例:

#!/usr/local/bin/python
import cgi, cgitb
import time
import threading

class TestThread(threading.Thread):
     def __init__(self):
         super(TestThread, self).__init__()

     def run(self):
        time.sleep(5)
        fileHand = open('../Documents/writable/output.txt', 'w')
        fileHand.write('Big String Goes Here.')
        fileHand.close()

print 'Starting Program'

thread1 = TestThread()
#thread1.daemon = True
thread1.start()

我读过这些关于多线程的SO帖子如何在Python中使用线程?在Python中同时运行多个线程-可能吗?线程在Python中是如何工作的,什么是常见的Python线程特定的陷阱?

最后一条说明在Python中并发运行线程实际上是不可能的。很公平。这些帖子中的大多数都提到了多处理模块,所以我已经读过了,它看起来相当简单。以下是我找到的一些资源:

如何同时运行两个函数Python多处理文档示例https://docs.python.org/2/library/multiprocessing.html

这是同样的例子,可以翻译成多重处理:

#!/usr/local/bin/python
import time
from multiprocessing import Process, Pipe

def f():
    time.sleep(5)
    fileHand = open('../Documents/writable/output.txt', 'w')
    fileHand.write('Big String Goes Here.')
    fileHand.close()

if __name__ == '__main__':
    print 'Starting Program'
    p = Process(target=f)
    p.start()

我想要的是让这些程序立即打印“开始程序”(在网络浏览器中),然后几秒钟后,一个文本文件出现在我赋予写权限的目录中。然而,实际发生的情况是,它们都在5秒钟内没有响应,然后它们打印“开始程序”并同时创建文本文件。我知道我的目标是可能的,因为我已经用PHP完成了,使用了这个技巧:

//PHP
exec("php child_script.php > /dev/null &");

我想这在Python中是可能的。请让我知道我是否错过了一些明显的东西,或者我是否以完全错误的方式思考这个问题。谢谢你的时间!

(系统信息:Python2.7.6,Mac OSX Mavericks.Python与自制软件一起安装。我的Python脚本在Apache 2.2.26中作为CGI可执行文件运行)

共有1个答案

闻枫
2023-03-14

好的,我想我找到了答案。部分原因是我自己的误解。python脚本不能简单地将消息返回到客户端(ajax)程序,但仍在执行一个大进程。响应客户机的行为本身就意味着程序已经完成了,线程和所有线程。因此,解决方案是使用此PHP技巧的python版本:

//PHP
exec("php child_script.php > /dev/null &");

在Python中:

#Python
subprocess.call(" python worker.py > /dev/null &", shell=True)

它在当前进程之外启动了一个全新的进程,并将在当前进程结束后继续。我将坚持使用Python,因为至少我们使用了一个文明的api函数来启动worker脚本,而不是exec函数,这总是让我感到不舒服。

 类似资料:
  • 我有下面的代码片段,它试图在多个子进程之间分割处理。 while循环中的主进程正在调用search函数,如果队列达到阈值计数,则处理池将映射到进程函数,其中作业来自队列。我的问题是,python多处理池是在执行期间阻塞主进程,还是立即继续执行?我不想遇到这样的情况,“has_jobs_to_process()”的计算结果为true,并且在处理作业的过程中,另一组作业的计算结果为true,并且再次调

  • Python 2.7。3 x64 wxPython 2.8 x64 我已经阅读了很多关于python线程和多处理的文章,特别是Doug Hellmann的一些文章,这些文章帮助很大。然而,我对一件事感到困惑。。。 我认为Python多处理模块或多或少是线程模块的替代品,只是args必须是可拾取的,但是我发现为了不阻塞我的GUI,我必须首先使用线程创建一个新线程。线程,然后在该线程内通过多处理进行多

  • 我有4-5个工作线程处理大型消息队列。我还有另一段代码,它使用2-3个worker运行。我想在处理大型消息队列时阻止所有其他工作者。 我正在使用JDK6和Jms 编辑: 队列进程工作者从未终止。当没有消息时,它们阻塞队列。这些工作者由执行器线程池管理,如果我使用读写锁,其中一个工作者也会被阻塞。此外,如果使用循环屏障,那么我必须终止线程,以便重新传递阻塞的第二个进程。由于工作者是由线程池管理的,所

  • 这是一个扩展Thread并实现run()函数的类: 现在在主活动中的一个按钮中,我有这样的代码: 据我所知,这应该将runnable放在目标线程的消息队列中,并且线程(不是UI线程)将在可能的情况下运行它。但此代码会阻止 UI。为什么会发生这种情况?如您所见,我将目标线程的循环器发送到处理程序构造函数,并且处理程序应使用该循环器而不是主线程的循环程序。

  • 问题内容: 我试图理解多处理比线程的优势。我知道多处理绕过了全局解释器锁,但是还有什么其他优点,线程不能做同样的事情? 问题答案: 该模块使用线程,该模块使用进程。不同之处在于线程在相同的内存空间中运行,而进程具有单独的内存。这使得在具有多处理的进程之间共享对象更加困难。由于线程使用相同的内存,因此必须采取预防措施,否则两个线程将同时写入同一内​​存。这就是全局解释器锁的作用。 生成过程比生成线程

  • 我不明白为什么webclient会阻止我使用gradle的主要netty线程,以下是它的依赖项: 这个gradle脚本在两个应用程序中都使用。在第一个应用程序中,我执行: 第二个应用程序模拟长响应处理: 我希望呼叫服务不会阻塞主线程,而是会继续处理传入的连接,但直到我收到第一个呼叫的响应(睡眠将起作用),我的下一个连接将挂起等待。 结果:第一个应用程序像tomcat一样工作,只有一个线程 我的问题