
有个需要 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 是否不能实现这个需求?
1 bdbai Dec 16, 2015 via iPhone 推荐用 requests ,只要共用一个 session 对象即可。 |
2 Tony042 Dec 16, 2015 via iPhone 用 asyncio+aiohttp 异步多好 |
5 binux Dec 16, 2015 1. 你的问题是多进程不是多线程 (这里是考点) 2. windows 的进程不继承全局变量 |
8 pynix Dec 16, 2015 先登录完再分发 cookies |
9 shidenggui Dec 16, 2015 这明明就是多进程吧,多线程如下: from threading import Thread 没有特殊理由的话建议使用 requests |
10 southwolf Dec 16, 2015 不是,你明知道要先登录再进行其他操作,这不明摆着是个顺序执行的事么,还非要用多进程 /多线程干啥? |
OP @binux 原来 multiprocessing 是多进程的啊…… @shidenggui 好的 @southwolf 我考虑的是多线程共享一个通信(cookie ?我不知道怎么叫) 因为实践证明分别登录会出问题 |
13 mengzhuo Dec 16, 2015 via iPhone 多进程共同数据的话得在 os.fork 之前 |
14 est Dec 16, 2015 你们啊,看标题总想搞个大新闻 |
15 paw Dec 16, 2015 从汇编到 C 到 python 等等等 都是图灵等价的。。。 什么实现不了,只是你不知道 |
16 powergx Dec 16, 2015 python 多线程 是假的 |
19 9hills Dec 16, 2015 看到标题感觉又是一场大战,没想到。。。只是把 process 当成线程了。。。 |
21 est Dec 16, 2015 python 明明是 os native thread 。还被讹传成假线程了。真应该用 user thread 糊你们一脸。或者不能共享数据的多线程。让你们唧唧歪歪 |
22 nomaka Dec 16, 2015 multiprocessing.Manager 可以共享变量 |
24 cjsoft Dec 16, 2015 via Android 先构建一个 cookiejar ,然后为每个 thread 构建一个 openner ,并 install 之前那个 jar 。这样 cookie 是可以在不同的 openner 之间共享的,值得一试,但是不保证不会出现一些奇怪的问题。 |
25 jamiesun Dec 17, 2015 不要用多线程,用异步 io |