这个需求 Python 是不是无法实现?

2015-12-15 22:18:16 +08:00
 Exin

有个需要 cookie 的页面,需要先登录再进行后续操作。
我用如下方法可以在单线程下成功。

cookie = cookielib.CookieJar()
handler = urllib2.HTTPCookieProcessor(cookie)
opener = urllib2.build_opener(handler)
opener.open(loginUrl, loginData).read() #登陆
opener.open(otherUrl, otherData).read() #后续操作

Python 多线程似乎不支持写入全局变量,用以下方式, opener 不能写入,因此后续操作不能进行:

def do(data):
global opener
opener.open(otherUrl, data).read()

cookie = cookielib.CookieJar()
handler = urllib2.HTTPCookieProcessor(cookie)
opener = urllib2.build_opener(handler)
pool = multiprocessing.Pool(processes = 2)
outputs = pool.map(do, [otherData, otherData]) #do 内进行后续操作
pool.close()
pool.join()

要求:不能在 pool 内登陆。
Python 是否不能实现这个需求?

3806 次点击
所在节点    Python
25 条回复
est
2015-12-16 12:32:13 +08:00
python 明明是 os native thread 。还被讹传成假线程了。真应该用 user thread 糊你们一脸。或者不能共享数据的多线程。让你们唧唧歪歪
nomaka
2015-12-16 13:46:29 +08:00
multiprocessing.Manager 可以共享变量
bdbai
2015-12-16 18:18:03 +08:00
@Exin requests 官方文档表示线程安全 *thread* 这个
cjsoft
2015-12-16 19:15:53 +08:00
先构建一个 cookiejar ,然后为每个 thread 构建一个 openner ,并 install 之前那个 jar 。这样 cookie 是可以在不同的 openner 之间共享的,值得一试,但是不保证不会出现一些奇怪的问题。
jamiesun
2015-12-17 18:26:00 +08:00
不要用多线程,用异步 io

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/243806

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX