有个需要 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
不是,你明知道要先登录再进行其他操作,这不明摆着是个顺序执行的事么,还非要用多进程 /多线程干啥?
|
11
Exin 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
|