[英]Multiprocessing in Python not working
我正在使用lxml进行webscraping。 我在一个文件(stock_names)中有超过1000个公司名称,在另一个文件(stocks_URL)中有相同数量的URL。
这需要无休止的,超过20分钟才能完成执行。 所以,我尝试在我的程序中使用多处理概念。 对于样本测试,我使用了10个comp.names及其URL。 当我运行该程序时,它在大约8秒内完成。 无论是否进行多处理,都需要相同的时间。 我不确定为什么在使用多处理时不会在较短的时间内执行。
以下是我的意见:
from lxml import html
import requests
import texttable as tt
from multiprocessing import Process
class bcolors:
ENDC = '\033[0m'
BGGREEN = '\033[42m'
def main(url, stock_names):
page = requests.get(url)
tree = html.fromstring(page.text)
percentage = tree.xpath('//span[@class="grnb_20"]/text()')
if percentage and int(percentage[0].rstrip('%')) > 70:
people = tree.xpath('//a[@class="bl_11"]/u/text()')
percentage = bcolors.BGGREEN + str(percentage[0]) + bcolors.ENDC
x.append([stock_names, percentage, people])
def stocks():
with open('stocks_url') as urlfile, open('stock_names') as stock_names:
for url, stock_names in zip(urlfile, stock_names):
q = Process(target=main(url, stock_names))
q.start()
q.join()
if __name__ == "__main__":
tab = tt.Texttable()
x = []
p = Process(target=stocks)
p.start()
p.join()
tab.add_rows(x)
tab.header(['Company', 'Percentage', 'People'])
tab.set_deco(tab.HEADER | tab.VLINES)
print tab.draw()
以下是输出:
$ time python stocks_3.py
...
...
...
real 0m7.904s
user 0m0.448s
sys 0m0.208s
当然,因为你使用join()
来自doc :
阻止调用线程,直到调用其join()方法的进程终止或直到发生可选超时。
因此,在一次迭代中,您调用p.join()
,然后主线程停止,直到新进程中的作业完成。 因此,您无法从多处理中获得任何好处。
解
通常人们在这种情况下使用多线程而不是多处理。 无论您使用多线程还是多重处理,请记住在将所有任务分配给新线程/进程后调用join
。
def stocks():
subp = []
with open('stocks_url') as urlfile, open('stock_names') as stock_names:
for url, stock_names in zip(urlfile, stock_names):
q = Process(target=main(url, stock_names))
subp.append(q)
q.start()
for p in subp:
p.join()
if __name__ == "__main__":
tab = tt.Texttable()
x = []
stocks()
tab.add_rows(x)
tab.header(['Company', 'Percentage', 'People'])
tab.set_deco(tab.HEADER | tab.VLINES)
print tab.draw()
无需在main中创建另一个进程。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.