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