我正在尝试使用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())
Parse功能:
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()
我真的被困在为什么它不是产卵过程但是整个程序运行正常,所以我有点困惑。
答案 0 :(得分:0)
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异常等内容。