进程未能启动Python
我正在尝试用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()
我真的搞不懂为什么它没有生成进程,但整个程序运行得很好,所以我有点困惑。
1 个回答
0
join() 是用来等待一个进程完成的。当你有这样的代码序列时:
p = Process(target=self.Parse)
p.start()
p.join()
父程序会等着子程序完成,这样在你检查的时候就不会有正在运行的子程序了。其实你直接调用这些函数会更好,因为反正你也是在等它们完成。通常这种代码会把进程对象放到一个列表里,先做其他的事情,等到工作完成后再回来处理这些进程。
你可以加一些调试代码来跟踪哪些代码被调用,以确认你的子程序确实在运行:
import time
with open('/tmp/trace.txt', 'a') as fp:
fp.write(time.asctime() + '\n')
一般来说,给你启动的进程添加一些日志记录是个好主意,这样你就能跟踪到像 Python 异常这样的情况。