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

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

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

以下是示例代碼

#-*-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)

昨天在運(yùn)行爬蟲(chóng)的時(shí)候,save_task有上千個(gè)URL,這得等好久才能存儲(chǔ)完。

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

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

回答
編輯回答
撥弦

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

2018年3月1日 20:47