繁体   English   中英

Python中的多处理无法正常工作

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM