Python:如何修复此代码,以便在Windows上运行?

时间:2011-11-12 03:16:14

标签: python multithreading mechanize

import lxml.html
import mechanize, cookielib
import multiprocessing

browser = None

def download(i):
    link = 'www.google.com'
    response = browser.open(link)
    tree = lxml.html.parse(response)
    print tree
    return 0

if __name__ == '__main__':    
    browser = mechanize.Browser()
    cookie_jar = cookielib.LWPCookieJar()
    browser.set_cookiejar(cookie_jar)
    browser.set_handle_equiv(True)
    browser.set_handle_gzip(True)
    browser.set_handle_redirect(True)
    browser.set_handle_referer(False) #inicialmente estava on mas deve ser melhor off
    browser.set_handle_robots(False)
    browser.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1)
    browser.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:2.0.1) Gecko/20100101 Ubuntu/11.04 maverick Firefox/4.0.1')]

    pool = multiprocessing.Pool(None)
    tasks = range(8)
    r = pool.map_async(download, tasks)
    r.wait() # Wait on the results

如果删除多处理部分,它可以正常工作。如果我没有在下载功能中调用浏览器,它也可以工作。但是,似乎多处理+机械化根本就不起作用。

我该如何解决这个问题?它不会在linux下发生。

2 个答案:

答案 0 :(得分:0)

我会尝试:

  • 删除browser = None
  • __name__=="__main__"中的代码移至main()函数,并在global browser之前添加browser=mechanize.Browser()
  • 移动将browser初始化为initializer
  • 的代码

如果您的任务受I / O限制,那么您不一定需要multiprocessing来发出并发请求。例如,您可以使用concurrent.futures.ThreadPoolExecutorgeventTwisted代替。

相关:Problem with multi threaded Python app and socket connections

答案 1 :(得分:0)

只有主进程执行gated if __name__ == '__main__'块。由于Windows缺少fork系统调用,因此池中创建的每个进程都需要自己的浏览器。您可以使用初始化函数执行此操作。有关参考,请参阅multiprocessing.Poolinitializerinitargs选项。

import lxml.html
import mechanize, cookielib
import multiprocessing as mp

def download(i):
    link = 'http://www.google.com'
    response = browser.open(link)
    tree = lxml.html.parse(response)
    print tree
    return 0

def init(count):
    global browser
    browser = mechanize.Browser()
    cookie_jar = cookielib.LWPCookieJar()
    browser.set_cookiejar(cookie_jar)
    browser.set_handle_equiv(True)
    browser.set_handle_gzip(True)  #warning
    browser.set_handle_redirect(True)
    browser.set_handle_referer(False)
    browser.set_handle_robots(False)
    browser.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), 
                               max_time=1)
    browser.addheaders = [('User-agent', 
        'Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:2.0.1) '
        'Gecko/20100101 Ubuntu/11.04 maverick Firefox/4.0.1')]

    count.value -= 1

if __name__ == '__main__':
    import time
    count = mp.Value('I', mp.cpu_count())
    pool = mp.Pool(count.value, initializer=init, initargs=(count,))
    #wait until all processes are initialized
    while count.value > 0:
        time.sleep(0.1)

    tasks = range(8)
    r = pool.map_async(download, tasks)
    r.wait()