• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            socketref,再見!高德

            https://github.com/adoggie

              C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
              246 Posts :: 4 Stories :: 312 Comments :: 0 Trackbacks

            常用鏈接

            留言簿(54)

            我參與的團隊

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            #

            Queue用于生產者、消費者模型 
            gevent提供了'Queue', 'PriorityQueue', 'LifoQueue', 'JoinableQueue' 四種隊列,文檔介紹不全 ,看了代碼方才了解

            所有隊列類型都是安全的(synchronized queue) ,數據推入和提取無需訪問保護

            LifoQueue - 后進先出隊列,同數據堆棧結構
            JoinableQueue -  增加join,所有數據提取完畢join解除阻塞 
            PriorityQueue - 優先級隊列,提取根據置入時的優先級別
            Queue - 超類消息隊列,提供同步數據置入和提取功能,其他隊列均從Queue派生
            posted @ 2013-09-19 14:44 放屁阿狗 閱讀(490) | 評論 (0)編輯 收藏

            TCE
            項目全稱Tiny Communication Engine,意味著小型的通信引擎




            RPC技術:
                RPC是指遠程過程調用(Remote Procedure Call),這種技術被定義出來應該有成長的歷史時間。
                RPC技術意在消除網絡通信的細節,讓開發者只需關心具體的業務而不必考慮由于網絡、硬件、系統的異構復雜環境。相關的RPC有DCOM,java的RMI,CORBA,VISIBROKER,ICE(zeroc.com)等等。
                xmlRPC是基于xml數據格式的RPC封裝,相關的使用項目也不老少,但這東東由于是xml格式,數據流量太大,不建議使用。

            使用RPC的原因:
                 傳統端到端的通信方式一般都是基于流的數據傳遞,應用消息在發送端編碼并傳送到接收端解碼。 這是一個重復造輪子的過程,不同的應用協議由于規格不同,消息到流的序列化和反序列化過程不可避免。這個過程是個容易出錯的過程,應用協議的改動則必須再次修改編解碼代碼,這不該是提倡的,且顯得異常無奈和低端。
                流式的數據在接收之后必須進行應用類型的消息分揀,以便分派消息到不同的處理函數,這個過程同樣也會被重復的編寫。
                


            TCE是RPC的實現:
                因為是輕量級的,所以很容易被修改、擴展或者被重新定義。 
                目前已經支持多種開發語言和通信方式。

            TCE的功能特點: 
                 1.多通信協議:   rpc的消息可以在多種協議上被交換,協議包括:socket,websocket,MQ,http。 socket應用于最常見的端端通信,c,s兩端直接socket完成通信; websocket支持html5的javascript與服務器的通信; MQ 指集群系統之間消息隊列作為數據傳遞總線時,Rpc消息作為MQ的消息包被傳遞交換。

                 2.基于接口級別的調用:  這種模式完全不同與流消息傳遞,用戶無需關心消息如何被序列化和反序列化,并且無需參與消息類型到處理業務函數的分揀,這一切都是自動的,A只需調用B的一個函數接口即可

                 3.多語言支持: TCE目前實現的語言有c++,java,javascript,as3,python 支持在這些語言之間互相接口調用。

                 4.一致的通信服務:   
                       tce內置高性能的通信服務器,c++版本采用boost::asio,python版本采用gevent作為通信引擎

                 5. 多種調用模式:
                        normal-call (twoway) - client調用server接口,此刻線程被阻塞,直到server處理返回
                           oneway-call - client調用server接口之后即刻返回,這種適用于揮發性的調用請求類型,例如:心跳包  
                           timeout-call - client調用server接口,此刻線程被阻塞,直到server處理返回,如果超時,線程會被解除阻塞
                           async-call - client調用server接口之后即刻返回,server處理返回之后將回調client的異步處理函數
                           reversed-call - NAT網絡模式下,client發起RPC調用時將建立與server的socket連接,并請求server端RPC接口;反向調用指server端憑借此連接調用client端的RPC接口

            接口定義語言(IDL):
                不同的Rpc的實現都有自己的定義規格,TCE的規格類似與ICE。
                文件命名:<interface>.idl 
                1. 數據類型: 
                  --name       size    c++                java             python             as3           javascript 
                    byte              1      int8                 byte             int                  byte
                    short             2      int16               short            int
                    int                 4      int32               int                int
                    float              4      float                float              float
                    long              8       int64              long              int
                    double           8      double             long              float
                    string            -       std::string       String           str
                    bool              1       bool                boolean         True/False
                    sequence                std::vector      Vector           []                 Array               Array
                    dictionary                std::map         HashMap       {}                HashMap          Hash
                    struct                     struct             class               class           class               function

                1. module:  系統模塊定義,同一個接口文件中可以包含多個module定義
                      module first{ ... }
                      module second{ ... }

                 2. struct :  數據結構定義
                           struct Student{
                               int no;
                               string name;
                               int grade;
                            };
                   
                 3. sequence: 數組 
                     sequence<int> IdList;
                     sequence<string> StrList;

                  4. dictionary: 哈希結構
                     dictionary<string,Student>   StudentList;

                  5. interface :  接口定義
                      interface GisServer{
                            string Authorize(string user,string passwd);
                            GpsData  getGpsData(string device_id);
                      };

                         
            posted @ 2013-09-15 22:25 放屁阿狗 閱讀(2309) | 評論 (0)編輯 收藏

            由于最近也是比較有時間,想著將Windows版本的地圖繪制引擎移植到Linux。
            地圖Render部分采用的是Qt,所以過程非常順利,用Eclipse+CDT重建工程,略微幾個小改動便完成了移植。
            但之后發現了Qt帶來的問題了,地圖繪制引擎支持并發處理多個繪制請求,不同的繪制請求將在不同的線程Thread中被執行,多線程的情況便出現了問題,提示QPixmap不能在非UI線程被構造,如果強行構造,便出現了內存數據訪問違例的異常錯誤,進程直接coredump,這個問題困擾了一些時間;
            之后改了改代碼,將數據處理和繪制代碼隔離開,線程thread中進行數據加載、分析、計算,繪制代碼采用Qt的signal/slot機制完成,就是工作線程處理好數據之后通過emit signal將繪制請求發送給ui主線程的slot處理函數。這種實現方法的問題在于繪制工作都將被串行執行,性能下降。
            幾年前在移植libsvg到wince時采用過cairo( cairographices.org) ,有點使用經驗,且cairo是gnome的標準圖形庫,性能應該不錯,所以直接改為cairo。
            cairomm是cairo的c++包裝,編譯還需sig++,cairo的api還是挺豐富的,字體,反走樣,矩陣... 操作也是相當簡單 
            很快移植完成,運行效果還是比較滿意,現在正考慮地圖引擎移植到ios設備,目前需要琢磨cairomm,sig++,pixmap之類的東西如何移植問題(或者直接采用ios的Fundation的繪圖api)

            posted @ 2013-08-31 15:39 放屁阿狗 閱讀(2592) | 評論 (1)編輯 收藏

            看到 AsyncResult這個類,想到我之前自己寫的處理異步返回值的類 

             1 class MutexObject:
             2     def __init__(self):
             3         self.mtx = threading.Condition()
             4         self.d = None
             5         
             6     def waitObject(self,timeout):
             7         d = None
             8         self.mtx.acquire()
             9         if self.d == None:
            10             if timeout:
            11                 self.mtx.wait(timeout)
            12             else:
            13                 self.mtx.wait()
            14             d = self.d
            15             self.d = None
            16         self.mtx.release()
            17         return d
            18         
            19     def notify(self,d):
            20         self.mtx.acquire()
            21         self.d = d
            22         self.mtx.notify()
            23         self.mtx.release()
            posted @ 2013-05-14 01:04 放屁阿狗 閱讀(495) | 評論 (0)編輯 收藏

             1 class SimpleConfig:
             2     def __init__(self):
             3         self.confile =''
             4         self.props={}
             5 
             6     def load(self,file):
             7         try:
             8             f = open(file,'r')
             9             lines = f.readlines()
            10             f.close()
            11             self.props={}
            12             for line in lines:
            13                 line = line.strip()
            14                 if not line or line[0]=='#':
            15                     continue
            16                 line = line.split('#')[0]
            17                 pp = line.split('=')
            18                 if len(pp)!=2:
            19                     continue
            20                 k,v = pp[0].strip(),pp[1].strip()
            21                 self.props[k] = v
            22         except:
            23             traceback.print_exc()
            24             self.props ={}
            25         return True
            26 
            27     def get(self,key,default=None):
            28         return self.props.get(key,default)
            posted @ 2013-04-02 13:36 放屁阿狗 閱讀(344) | 評論 (0)編輯 收藏

            聊聊草草
            實現一套通信框架
            A - 移動終端; B - 接入服務器(網關) , C,D,E - 內部服務系統 , M -內部服務系統的消息隊列
            B 用于接入成千上萬的A,B不具備業務能力,只有CDE才能與A進行業務交互,M充當消息管道。
            一般的做法,各個系統模塊指定標準協議,可以是xml或者二進制的,然后各開發各的,socket或者http等部件,開發語言也是cpp,python,java齊上陣。
            這種開發模式過于繁瑣,模塊之間的耦合比較緊密,應該把應用和通信細節剝離出來。
            我的做法是所有有系統對象之間的消息傳遞都是基于Rpc接口級的調用,更本不設計通信、協議編碼,只要根據IDL就可以,A請求C的服務,那A只需要調用C的接口函數即可,底部的工作:
            A到B的socket通信,B將A的消息轉換到M,M再傳輸到C,這些工作都可以透過Rpc層完成透明,反過來C的調用請求也安原路返回到A。
            C要發送消息到A,那調用A的接口,rpc層自動將請求轉化未MQ協議,被路由到B,B找到A的鏈接,并將Mq消息轉化未socket消息傳遞到A,A端接收消息轉換成Rpc函數回調到A的應用代碼。

            除了簡單的調用、返回方式還有
            單項調用請求、異步調用請求、消息廣播請求

            B端可以通過外部配置使得A的請求路由到C,或者D,或者全部接收,取決與應用需求(應用還是集群)
            MQ如果系統總線一般,將各個服務子系統鏈接成網絡,是構成整個系統的基礎。Rpc可以解脫程序員,讓其將經歷花在具體業務上,而且基本只要編寫若干的服務接口函數即可。

            當然要實現以上功能特點,很多可用的框架,CORBA,DCOM,ICE等等,但這些過于龐大,對環境要求也有限制,如果要更高效、靈活的運用和包裝需要大量修改其底層代碼,與第三方的整合只能工作在他們的上層接口上,這個令人很沮喪,會導致產生更多的依賴和復雜的編程技巧。
            這些全都丟棄,還是自己的rpc
            posted @ 2012-11-22 10:50 放屁阿狗 閱讀(3531) | 評論 (0)編輯 收藏

                 摘要: 弄Rpc有一段時間了,從定義IDL規則,自動生成存根代碼給應用使用,相繼做了c++,java,python,actionscript四個版本,且都都能互相調用,協議是自定義的二進制格式。公司的項目要求我從事android的開發,編寫一些小的應用,要與平臺服務器通信。與服務器的通信采用xml交換,之前做的二進制編碼便不能使用。不想很弱智的去重復的編解碼xml消息格式,去編寫socket通信代碼,工作...  閱讀全文
            posted @ 2012-11-22 10:17 放屁阿狗 閱讀(2756) | 評論 (0)編輯 收藏

            w3.org定義了websocket的規范,但僅限于草案。
            websocket的出現可以提高用戶交互體驗,減少網絡io負荷
            當初http的出現,只是那個時代的產物,我覺得現在其已經是一種負擔和糟粕,應該推行出一套全新的符合時代潮流的互聯網協議,但又如何簡單。
            看了websocket與node.js的應用demo,由于還是 基于http鏈路的,所以消息的marshall/unmarshall必須是明文編碼,以 00開始ff結束一個封包。這很令我想不明白為何這么定義,也許草案階段的產物。那xml,json是格式化的最終選擇,兩端都是javascript引擎驅動數據轉換,某種應用角度來講不錯,但如果做實時的應用我覺得存在io浪費、時延等諸多問題。
            這個問題在于http的規范,且互聯網上充斥著對http支持的設備和系統,路由、網管都能識別http的報文并進行處理、分析。
            也許還再等等看看

            自己在寫的rpc可以實現python與flex進行rpc通信,等有時間實現一下websocket的rpc
            posted @ 2012-09-15 14:15 放屁阿狗 閱讀(443) | 評論 (0)編輯 收藏

            提高水平總是靠學習他人代碼來的快

            看看這個代碼,摘錄自gameobject
             1   def __init__(self, x=0., y=0.):
             2         """Initialise a vector
             3 
             4         @type x: number
             5         @param x: The x value (defaults to 0.), or a container of 2 values
             6         @type x: number
             7         @param y: The y value (defaults to 0.)
             8 
             9         """
            10         if hasattr(x, "__getitem__"):
            11             x, y = x
            12             self._v = [float(x), float(y)]
            13         else:
            14             self._v = [float(x), float(y)]
            挺好的,參數帶入可以支持 a(1,2)形式,也可支持a( (1,2) )形式 ,非常靈活,自已以前總是想不到用hasattr來判斷


            posted @ 2012-07-10 10:04 放屁阿狗 閱讀(412) | 評論 (0)編輯 收藏

            應用中會有輸入gps坐標,計算返回所處地理位置文本描述
            例如: (x,y) => 虹梅路2007號 宜山路200號 蘇寧電器正南方向300米

            當然數據必須要有,包括 poi和道路數據
            為了實現快速檢索,將feature數據進行分幅存儲,把全國地圖進行切割成固定網格大小,并將不同層feature存儲這個網格內
            切割存儲feature到網格,實現的方法很多:
             postgis , oracle sde ,arcgis sde , osge算法庫,ogr....
            我采用postgis將切割的feature放入數據表,建立好相關索引
            輸入gps坐標,先轉換成地圖坐標,然后檢索出以地圖坐標為中心的九宮格地理網格,然后在這些網格內計算不同的feature與當前gps坐標的位置描述

            例如: 輸入 121.20,31.20
            返回 :
            上海旺而固實業有限公司    71.6009040754    165.190566006 degree正北方
            上海起帆電纜有限公司    77.4887765243    168.290539492 degree正北方
            塔星集團新塔星石材    78.9584224298    161.627196901 degree正北方
            上海大寶化工制品有限公司    87.7190868822    151.671844699 degree東北方
            第二個參數是距離(米) ,第三個為兩點之間的夾角,最后一個表示方位

              1 #計算點a,b,c的夾角
              2 def abc_angle(a,b,c):
              3     ba= Vector2.from_points(b,a)
              4     bc = Vector2.from_points(b,c)
              5     #點乘計算夾角
              6     dot = (ba[0]*bc[0]+ba[1]*bc[1] )
              7     x =  dot/ (ba.get_magnitude()*bc.get_magnitude() )
              8     angle =  (math.acos(x) / math.pi) * 180
              9     return angle
             10 
             11 #print abc_angle(b,a,c)
             12 
             13 
             14 def whereis(p1,p2):
             15     '''
             16         判別p2所處p1的方向位置
             17     '''
             18     txt=''
             19     a,b,c = (p1[0],0),p1,p2
             20     a =  abc_angle(a,b,c)
             21     if a <= 20:
             22         txt=u'正南方'
             23     elif a>=160:
             24         txt = u'正北方'
             25     elif a>20 and a<=70:
             26         if p2[0] <= p1[0]:
             27             txt =u'西南方'
             28         else:
             29             txt = u'東南方'
             30     elif a>=70 and a<=110:
             31         if p2[0] <= p1[0]:
             32             txt = u'正西方'
             33         else:
             34             txt = u'正東方'
             35     else:
             36         if p2[0] <= p1[0]:
             37             txt = u'西北方'
             38         else:
             39             txt = u'東北方'
             40     return a,txt
             41 
             42 '''
             43 設定查找九宮格,xy位置處于MIDDLE_CENTER
             44 select name,st_distance(ST_MAKEPOINT(121.2,31.2),the_geom) as dist , * from data_c31_point order by dist limit 100;
             45 
             46 cast(x'fff' as int)
             47 
             48 select distinct(layerid),count(*) from data_c31_point group by layerid
             49 '''
             50 def searchPoints(xy,layers):
             51     '''
             52         xy - (lon,lat) gps坐標點
             53         layers - ()  查詢的層編號列表
             54     '''
             55     xy = point_g2m(xy[0],xy[1])
             56     bid = breadth.getBreadthId(xy)
             57     x = breadth.getX(bid)
             58     y = breadth.getY(bid)
             59     xx = x-1,x+1
             60     yy = y-1,y+1 #在9個網格內檢索
             61     layers = ','.join(map(str,layers))
             62 
             63     sql ='''
             64         select st_x(the_geom) as x,st_y(the_geom) as y,name,st_distance(ST_MAKEPOINT(%s,%s),the_geom) as dist
             65         from data_c31_point
             66         where
             67         layerid in ( %s )
             68         and
             69         ( (bid>>12) &4095 ) >=%s
             70         and
             71         ( (bid>>12) &4095 ) <=%s
             72         and
             73         ( bid&4095 ) >=%s
             74         and
             75         ( bid&4095 ) <=%s
             76         order by dist
             77         limit 100;
             78         '''%(xy[0],xy[1],layers,xx[0],xx[1],yy[0],yy[1])
             79 
             80     #print sql
             81 
             82     '''
             83     不同層檢索出的poi要選擇性的輸出
             84     計算每個點處于輸入gps坐標的方向: 正南,東南. + 距離
             85     '''
             86     db = getDBConn()
             87     cr = db.cursor()
             88     cr.execute(sql)
             89     rs=[]
             90     while True:
             91         r = dbconn.fetchoneDict(cr)
             92         if not r:
             93             break
             94         a,postxt = whereis((r['x'],r['y']),xy)  #gps坐標處于地理poi的方位
             95         rs.append([r['name'],r['dist'],postxt,a] )
             96     return rs
             97 
             98 if __name__=='__main__':
             99     rs = searchPoints((121.20,31.2),range(17,22))
            100     f = open('geotxt.txt','w')
            101     for r in rs:
            102         f.write(r[0].decode('utf8').encode('gbk'))
            103         f.write('    %s    %s degree'%(r[1]*1000*11,r[3]))
            104         f.write(r[2].encode('gbk'))
            105         f.write('\n')
            106         #print r[0].decode('utf8').encode('gbk')
            107     f.close()
            posted @ 2012-07-07 02:26 放屁阿狗 閱讀(2051) | 評論 (1)編輯 收藏

            僅列出標題
            共25頁: 1 2 3 4 5 6 7 8 9 Last 
            国内高清久久久久久| 九九久久99综合一区二区| 久久无码人妻一区二区三区| 精品999久久久久久中文字幕| 99久久国产热无码精品免费久久久久 | 国产亚洲精品自在久久| 久久精品这里只有精99品| 99久久国产精品免费一区二区| 久久国产精品无码一区二区三区| 国产A级毛片久久久精品毛片| 狠狠色丁香久久婷婷综合蜜芽五月| 丰满少妇人妻久久久久久| 久久九色综合九色99伊人| 亚洲国产另类久久久精品小说| 亚洲天堂久久精品| 久久久久久无码Av成人影院| 久久午夜免费视频| 精品久久综合1区2区3区激情 | 国产精品久久久久久一区二区三区| 久久久久国产视频电影| 久久91精品国产91久久户| 久久人人爽人人爽人人片AV不| 亚洲午夜福利精品久久| 99久久www免费人成精品| 久久―日本道色综合久久| 国产亚洲精品美女久久久| 久久亚洲私人国产精品| 97精品依人久久久大香线蕉97 | 99久久精品免费看国产一区二区三区| 久久国产精品久久久| 国产精品视频久久| 国内精品九九久久久精品| 久久丫精品国产亚洲av| 亚洲精品无码久久久久去q | 久久综合伊人77777麻豆| 国产精品久久自在自线观看| 狠狠久久亚洲欧美专区| 久久超碰97人人做人人爱| 久久Av无码精品人妻系列| 国产精品美女久久久| 日本精品久久久久中文字幕8 |