Python:如何修复此代码以使其在 Windows 上运行?
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下不会发生这种情况。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
只有主进程执行门控
if __name__ == '__main__'
块。由于 Windows 缺乏 fork 系统调用,因此池中创建的每个进程都需要自己的浏览器。您可以使用初始化函数来完成此操作。有关参考,请参阅 initializer 和initargs
选项="nofollow">多处理池。Only the main process executes the gated
if __name__ == '__main__'
block. Since Windows lacks a fork system call, each process created in the pool needs its own browser. You can do this with an initializer function. For reference, see theinitializer
andinitargs
options of multiprocessing.Pool.我会尝试:
browser = None
或者
__name__=="__main__"
中的代码移至main()
函数中,并在browser=mechanize之前添加
全局浏览器
。浏览器()或
浏览器
的代码移动到初始化程序
如果您的任务受 I/O 限制,那么您不一定需要
多处理
来发出并发请求。例如,您可以使用concurrent.futures.ThreadPoolExecutor、gevent、Twisted 来代替。相关:多线程 Python 应用程序和套接字连接的问题
I would try to:
browser = None
or
__name__=="__main__"
intomain()
function and addglobal browser
beforebrowser=mechanize.Browser()
or
browser
to aninitializer
If your tasks are I/O bound then you don't necessarily need
multiprocessing
to make concurrent requests. For example, you could useconcurrent.futures.ThreadPoolExecutor
,gevent
,Twisted
instead.Related: Problem with multi threaded Python app and socket connections