鍍金池/ 問答/Java  Python  網(wǎng)絡(luò)安全/ python2.7 協(xié)程,如何調(diào)度運行兩個協(xié)程?

python2.7 協(xié)程,如何調(diào)度運行兩個協(xié)程?

我想在爬蟲文件里定義兩個協(xié)程,一個是save_task,另一個是get_task。但是運行這個py文件后,每次都是save運行完之后才開始運行g(shù)et,如何調(diào)度兩個協(xié)程,在save的時候也進行g(shù)et???
對協(xié)程還不是很了解,
如果用多線程,還需要加鎖,對爬蟲會有速度影響。

以下是示例代碼

#-*-coding:utf-8-*-
from setting import mongo_host,mongo_port,mongo_db_name_data,mongo_db_name_linkbase,mongo_db_name_task
import pymongo
import gevent
from gevent import monkey
monkey.patch_all()



class Connect_mongo(object):
    def __init__(self):
        self.mongo_host = mongo_host
        self.mongo_port = mongo_port
        self.conn()

    def conn(self):
        self.client = pymongo.MongoClient(host=self.mongo_host,port=self.mongo_port)
        self.db_data = self.client[mongo_db_name_data]
        self.db_linkbase = self.client[mongo_db_name_linkbase]
        self.db_linkbase_collection = self.db_linkbase.linkbase
        self.db_task = self.client[mongo_db_name_task]

    def insert_db(self,item):
        self.db_data.test_task.insert(item)

    def get_task(self,max_requests=10):
        task = []
        for i in range(max_requests):
            result = self.db_data.test_task.find_one_and_delete({})
            task.append(result)
        return task


mongo_insert = Connect_mongo()

def test1():
    for i in xrange(100):
        data = {}
        data['info'] = i
        print '當(dāng)前插入數(shù)值為',i
        mongo_insert.insert_db(data)

def test2():
    for task in mongo_insert.get_task(10):
        print task


save_jobs = [gevent.spawn(test1) for item1 in range(20)]
gevent.joinall(save_jobs)

get_jobs = [gevent.spawn(test2) for item2 in range(20)]
gevent.joinall(get_jobs)

昨天在運行爬蟲的時候,save_task有上千個URL,這得等好久才能存儲完。

并且還有個問題,我才注意到,存儲的數(shù)據(jù),20個save_job存儲了20個0,有的數(shù)據(jù)甚至存了34個。一共100個數(shù)據(jù),從數(shù)據(jù)庫里查詢有3800個。。。。。。

20個save_job協(xié)程就是運行了20個程序,存儲了20個相同的數(shù)值,貌似還可以理解。。。。。。

回答
編輯回答
撥弦

第一個問題: 如果不用多進程或多線程,你的問題在我知識范圍內(nèi)無解。計算機是從上到下順序執(zhí)行的。
第二個問題: 協(xié)程就是代碼層面的多進程,我是這么理解的。然后你看你的代碼,save_task相當(dāng)于一次性執(zhí)行了20個相同的函數(shù)。所以數(shù)據(jù)庫中一定會有20個相同的數(shù)據(jù)

2018年3月1日 20:47