Python 通过multiprocessing.Process()子类进行并行处理

Python 通过multiprocessing.Process()子类进行并行处理,python,html,multithreading,python-multiprocessing,Python,Html,Multithreading,Python Multiprocessing,以下是我的节目布局: 有些进程专门用于从一长串URL中获取、美化和编码HTML(因为美化对象不能被pickle)。此HTML被放入多处理.JoinableQueue()中。另外,从队列中分离出一些进程get(),重新美化组并解析HTML,并填充带有一些数据的本地字典。然后将字典传递到另一个队列,在该队列中,专用线程将字典作为行写入文件 我正在创建这样的流程: numProcesses = 6 numGetProcesses = 3 # Get HTML getProcesses = [] fo

以下是我的节目布局:

有些进程专门用于从一长串URL中获取、美化和编码HTML(因为美化对象不能被pickle)。此HTML被
放入
多处理.JoinableQueue()
中。另外,从队列中分离出一些进程
get()
,重新美化组并解析HTML,并填充带有一些数据的本地字典。然后将字典传递到另一个队列,在该队列中,专用线程将字典作为行写入文件

我正在创建这样的流程:

numProcesses = 6
numGetProcesses = 3

# Get HTML
getProcesses = []
for ii in range(numGetProcesses):
    newProcess = GetHTML(urlInputQ, htmlOutputQ)
    getProcesses.append(newProcess)
    newProcess.start()    

# Parse HTML
parseProcesses = []
for ii in range(numProcesses - numGetProcesses)
    newProcess = ParseHTML(htmlOutputQ, dataOutputQ)
    parseProcesses.append(newProcess)
    newProcess.start()
然后,如果
GetHTML
进程在
ParseHTML
进程之前完成其工作,我[认为我]会终止它们,并创建新的
ParseHTML
进程:

for process in getProcesses: process.join() # Wait for HTML
# Dedicate newly freed CPU to parsing
print('Redistributing wealth...')
for ii in range(numGetProcesses):
    oldProcess = getProcesses.pop()
    oldProcess.terminate()
    newProcess = csdb.ParseHTML(htmlOutputQ, dataOutputQ)
    parseProcesses.append(newProcess)
    newProcess.start()
首先,我希望这将有3个进程用于获取HTML,3个进程用于解析HTML。然后,当HTML获取完成时,应该有6个进程解析HTML。出现了两个问题,我认为可能导致这些问题的原因是我对事情结局的误解:

1) 当我将
numgetprocesss
更改为1或5时,我看不到程序的总速度有什么不同(大约有1000个URL,大约需要3分钟完成)

2) 我还发现HTML get和HTML解析队列清空所需的时间没有区别

3) 消息“重新分配财富…”总是在
ParseHTML
进程完全清空队列前几秒钟弹出。也就是说,
GetHTML
进程(无论是1个还是5个)在同一时间完成,并且与
ParseHTML
进程在同一时间完成

在我看来,似乎每个函数都有固定数量的进程在运行,而不管我设置了多少个进程或启动了多少个进程。有人有什么想法吗


抱歉,我不能包含完整的工作代码。它太大了。然而,这里是
GetHTML
类的外观。
ParseHTML
类的设置与此类似,但做的更多:

煮汤(url)

ua = 'Mozilla/5.0 (X11; Linux x86_64; rv:18.0) Gecko/20100101 Firefox/18.0 (compatible;)' #For User-Agent header
def CookSoup(url):
    request = urllib2.Request(url) # Requests URL
    request.add_header('User-Agent', ua) # Adds User Agent
    response = urllib2.urlopen(request) # Opens URL
    soup = BeautifulSoup(response) # Creates soup
    response.close() #Closes file
    return soup #Returns the HTML

消息“重新分配财富…”总是在解析HTML进程完全清空队列前几秒钟弹出。“你怎么知道?”?ParseHTML类是否有诊断
print
语句?如果是这样的话,这可能只是缓冲区的怪异,在主进程执行之前,ParseHTML的
print
会执行,但是主进程
print
会首先呈现到屏幕上。是的。仅出于调试目的,
ParseHTML
类在每次完成页面时都会打印一些内容。我会去冲洗缓冲液看看有没有用
ua = 'Mozilla/5.0 (X11; Linux x86_64; rv:18.0) Gecko/20100101 Firefox/18.0 (compatible;)' #For User-Agent header
def CookSoup(url):
    request = urllib2.Request(url) # Requests URL
    request.add_header('User-Agent', ua) # Adds User Agent
    response = urllib2.urlopen(request) # Opens URL
    soup = BeautifulSoup(response) # Creates soup
    response.close() #Closes file
    return soup #Returns the HTML