gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 16:22:32 24 4
gpt4 key购买 nike

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

如果我删除多处理部分,它就可以工作。如果我不在下载功能内调用浏览器,它也可以工作。但是,似乎 multiprocessing + mechanize 根本不起作用。

我怎样才能解决这个问题?在 linux 下不会发生。

最佳答案

只有主进程执行门控 if __name__ == '__main__'堵塞。由于 Windows 缺少 fork 系统调用,池中创建的每个进程都需要自己的浏览器。您可以使用初始化函数来做到这一点。如需引用,请参阅 initializerinitargs multiprocessing.Pool 的选项.

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()

关于Python:如何修复此代码以使其在 Windows 上运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8102293/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com