【问题标题】:Process not spawning python进程不产生python
【发布时间】:2014-04-17 15:46:10
【问题描述】:

我正在尝试用 Python 制作一个多进程程序。我已经导入多进程模块,我尝试像这样开始处理:

    p = Process(target=self.Parse)
    p.start()
    p.join()

在类中,我有一个内部线程计数器,每次生成进程时我都会递增计数器。但是当我打印线程计数时,计数不会增加。然后我调用 multiprocessing.active_children() 但这会返回一个空列表。程序真的不会产生线程或进程,还是只是报告它?代码如下:

def run(self):
    if self.cont:
    while self.nxtLink or (self.thread>1):
        print(active_children())
        if self.thread<=self.count:
            p = Process(target=self.Parse)
            p.start()
            p.join()
        else:
            self.crawl(nxtLink.popleft())

解析函数:

def Parse(self):
    self.thread+=1
    self.lock.acquire()
    next = self.nxtLink.popleft()
    self.lock.release()
    results = parser(next[0],next[1])
    #print("In Parse")
    self.broken[next[0]] = results.broken
    for i in results.foundLinks:
        if(self.thread<=self.count+5):
            p = Process(target = self.request, args = (i,next[0]))
            p.start()
            p.join()
        else:
            while (self.thread>self.count+5):
               pass   #Waits for the thread count to drop before spawning a new thread. 
            p = Process(target = self.request, args = (i,next[0]))
            p.start()
            p.join()
    self.lock.acquire()
    self.thread-=1
    self.lock.release()

最后是请求函数:

def request(self, requestURL, requestingPageURL):
    # print(requestURL)
    self.lock.acquire()
    self.thread+=1
    self.lock.release()
    try:
        before = list(self.prev)
        self.lock.acquire()
        self.prev.append(requestURL)
        self.lock.release()
        if(requestURL in before):
            #print(before)
            return
        nextRequest = req.urlopen(requestURL)
        self.lock.acquire()
        self.nxtLink.append((requestURL,nextRequest))
        self.lock.release()
    except err.URLError:
        self.lock.acquire()
        try:
            self.broken[requestingPageURL].append(requestURL)
        except KeyError:
            self.broken[requestingPageURL] = [requestURL]
        self.lock.release()
    finally:
        self.lock.acquire()
        self.thread-=1
        self.lock.release()

我真的很困惑为什么它没有生成进程但是整个程序运行良好,所以我有点困惑。

【问题讨论】:

    标签: python multithreading process spawning


    【解决方案1】:

    join() 等待进程完成。当您有这样的序列时:

    p = Process(target=self.Parse)
    p.start()
    p.join()
    

    父程序等待子程序完成,因此您在进行检查时没有活动的子程序。你最好只调用函数而不是产生孩子,因为你只是等待它们完成。像这样的代码将 Process 对象放在一个列表中,做其他工作,然后在工作完成后回来加入它们是很常见的。

    您可以添加一些调试代码来跟踪所调用的内容,以验证您的子代码是否正在运行:

    import time
    with open('/tmp/trace.txt', 'a') as fp:
        fp.write(time.asctime() + '\n')
    

    一般来说,向您生成的进程添加一些日志记录是个好主意,这样您就可以在代码中跟踪诸如 python 异常之类的事情。

    【讨论】:

    • 嗯,我没有意识到 join() 做到了。还有一个问题,您如何将流程放在列表中然后加入它们?
    • @user2985233,有很多方法可以做到这一点,具体取决于您的代码。查看 multiprocessing.Pool 的文档以及使用 multiprocessing.Queue 获取提示的示例。您可以将队列传递给进程,并让它在完成后发送“完成”消息。然后,读取队列告诉你接下来应该加入哪个进程。
    • 所以我应该将所有线程都放在一个列表中并不断轮询该列表以查看完成了哪些进程?然后加入?
    • 很难说,因为你的例子很复杂......而且可能还没有真正起作用。例如,您在类实例上运行 Process,然后执行锁、thread+1、nxtLink.popleft() 等,这没有意义(例如,它是一个不同的进程,所以父 self.thread 不是子self.thread)。这看起来可以使用 multiprocessing.Pool 处理 - 您可以更改代码直到它适合模型。
    • 上面的代码工作正常。除了这个主线程和另一个线程之外,只是不会产生额外的线程。
    猜你喜欢
    • 1970-01-01
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    • 2012-02-16
    • 2021-07-17
    • 2023-03-05
    • 2012-07-04
    • 2022-06-21
    相关资源
    最近更新 更多