注意是python 2.7, (multiprocessing值支持到2.6,2.7下安装会报错)
用threadpool试了一下,总是报错:
data = ['a', 'b', 'c']
#data传到threadpool.makeRequests里面的第二个参数,函数会将这个列表里面的值取出来,然后根据并发数进行并发。
def repost(data):
response = requests.post(url, data).text
return response
def postresult(requestself, responseresult):
print(responseresult)
#其他的处理,比如对结果插入到数据库,或者写入日志等,可以在这里写
pool = threadpool.ThreadPool(5)
requests = threadpool.makeRequests(repost, data, postresult)
**#之前出问题,是因为这里requests的名称定义和requests()方法冲突了。。。然后报错又很奇怪,没引起注意,把这里的requests改个名字就OK了。各位,承让了。
当然,下面这一样,也改一下。requests的名称。
[pool.putRequest(req) for req in requests]
pool.wait()
报错如下:
Traceback (most recent call last):
File "C:\User\AppData\Local\Programs\Python\Python35-32\lib\site-packages\threadpool.py", line 158, in run
result = request.callable(*request.args, **request.kwds)
File "C:\test.py", line 29, in repost
response = requests.post(url, data1).text
AttributeError: 'list' object has no attribute 'post'
或者有没有其他实现方法?
我靠,我靠,我靠靠靠。。。。问题解决了。看上面的备注。再见。
Collez d'abord l'intégralité du test.py. À partir du message d'erreur, vous devriez avoir écrasé la variable de requête, ce qui fait que la requête devient un type de liste.
Il est recommandé de ne pas utiliser ThreadPool pour obtenir une concurrence multiple. Sur la base des caractéristiques de Python, même si vous utilisez le multi-threading, vous ne pouvez exécuter qu'une seule instruction en même temps, et l'amélioration des performances du multi-threading est. limité.
Vous devez d'abord rendre le réseau asynchrone, puis implémenter ioloop de base, ou vous pouvez implémenter une multi-concurrence monothread basée sur asyncio ou tornado
2.7 n'a pas d'asyncio, vous pouvez utiliser gevent ou similaire, et il existe des dizaines de 2.7 qui devraient avoir le multitraitement, mais le vôtre est gourmand en E/S et l'utilisation de plusieurs processus sera contre-productive. implémenter des coroutines