grpc python 原始碼分析(1):server 的建立和啟動

xuyiming888發表於2020-12-22

from concurrent import futures
import time
import grpc
from example import helloworld_pb2_grpc, helloworld_pb2

實現 proto 檔案中定義的 GreeterServicer

class Greeter(helloworld_pb2_grpc.GreeterServicer):
# 實現 proto 檔案中定義的 rpc 呼叫
def SayHello(self, request, context):
return helloworld_pb2.HelloReply(message=‘hello {msg}’.format(msg=request.name))

def SayHelloAgain(self, request, context):
    return helloworld_pb2.HelloReply(message='hello {msg}'.format(msg=request.name))

def serve():
# 啟動 rpc 服務
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
helloworld_pb2_grpc.add_GreeterServicer_to_server(Greeter(), server)
server.add_insecure_port(’[::]:50051’)
server.start()
try:
while True:
time.sleep(60 * 60 * 24) # one day in seconds
except KeyboardInterrupt:
server.stop(0)

if name == ‘main’:
serve()
複製程式碼
1️⃣ 建立 server
這裡我們傳了一個執行緒池給 grpc 的 server ,這個執行緒池用來處理請求。
經過重重呼叫,最後我們得到的 server 是 _Server 的例項

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
class _Server(grpc.Server):

# pylint: disable=too-many-arguments
def __init__(self, thread_pool, generic_handlers, interceptors, options,
             maximum_concurrent_rpcs, compression):
    completion_queue = cygrpc.CompletionQueue()
    server = cygrpc.Server(_augment_options(options, compression))
    server.register_completion_queue(completion_queue)
    self._state = _ServerState(completion_queue, server, generic_handlers,
                               _interceptor.service_pipeline(interceptors),
                               thread_pool, maximum_concurrent_rpcs)

def add_generic_rpc_handlers(self, generic_rpc_handlers):
    _validate_generic_rpc_handlers(generic_rpc_handlers)
    _add_generic_handlers(self._state, generic_rpc_handlers)

def add_insecure_port(self, address):
    return _common.validate_port_binding_result(
        address, _add_insecure_port(self._state, _common.encode(address)))

def add_secure_port(self, address, server_credentials):
    return _common.validate_port_binding_result(
        address,
        _add_secure_port(self._state, _common.encode(address),
                         server_credentials))

def start(self):
    _start(self._state)

def wait_for_termination(self, timeout=None):
    # NOTE(https://bugs.python.org/issue35935)
    # Remove this workaround once threading.Event.wait() is working with
    # CTRL+C across platforms.
    return _common.wait(self._state.termination_event.wait,
                        self._state.termination_event.is_set,
                        timeout=timeout)

def stop(self, grace):
    return _stop(self._state, grace)

def __del__(self):
    if hasattr(self, '_state'):
        # We can not grab a lock in __del__(), so set a flag to signal the
        # serving daemon thread (if it exists) to initiate shutdown.
        self._state.server_deallocated = True

cygrpc.CompletionQueue 和 cygrpc.Server 都是呼叫底層的 c++ core ,我們不去管它。
再來看看這個 _ServerState 的程式碼

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class _ServerState(object):

# pylint: disable=too-many-arguments
def __init__(self, completion_queue, server, generic_handlers,
             interceptor_pipeline, thread_pool, maximum_concurrent_rpcs):
    self.lock = threading.RLock()
    self.completion_queue = completion_queue
    self.server = server
    self.generic_handlers = list(generic_handlers)
    self.interceptor_pipeline = interceptor_pipeline
    self.thread_pool = thread_pool
    self.stage = _ServerStage.STOPPED
    self.termination_event = threading.Event()
    self.shutdown_events = [self.termination_event]
    self.maximum_concurrent_rpcs = maximum_concurrent_rpcs
    self.active_rpc_count = 0

    # TODO(https://github.com/grpc/grpc/issues/6597): eliminate these fields.
    self.rpc_states = set()
    self.due = set()

    # A "volatile" flag to interrupt the daemon serving thread
    self.server_deallocated = False

從這裡我們可以看到,python 的 server 只是對底層的簡單封裝,關於網路IO的處理完全是底層的 c++ core 負責,python 主要負責呼叫開發者的介面處理請求。

2️⃣ 註冊介面方法
這步負責將我們開發好的介面註冊到伺服器上,呼叫的是編譯 proto 檔案生成的 _pb2_grpc 字尾檔案的函式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def add_GreeterServicer_to_server(servicer, server):
rpc_method_handlers = {
‘SayHello’: grpc.unary_unary_rpc_method_handler(
servicer.SayHello,#介面呼叫
request_deserializer=helloworld__pb2.HelloRequest.FromString,#反系列方法
response_serializer=helloworld__pb2.HelloReply.SerializeToString, #系列方法
),
‘SayHelloAgain’: grpc.unary_unary_rpc_method_handler(
servicer.SayHelloAgain,
request_deserializer=helloworld__pb2.HelloRequest.FromString,
response_serializer=helloworld__pb2.HelloReply.SerializeToString,
),
}
generic_handler = grpc.method_handlers_generic_handler(
‘Greeter’, rpc_method_handlers)
server.add_generic_rpc_handlers((generic_handler,))

請求的路由分發使用的是字典,key 是我們定義的介面名,value 則是一個命名元組,裡面儲存的我們的介面方法、序列化方法和反序列化。

3️⃣ 繫結監聽埠
這個最後是呼叫 c++ core 的程式碼,直接忽略

4️⃣ 服務啟動
server 的 start 方法只是呼叫 _start 函式

1
2
def start(self):
_start(self._state)

1
2
3
4
5
6
7
8
9
10
11
def _start(state):
with state.lock:
if state.stage is not _ServerStage.STOPPED:
raise ValueError(‘Cannot start already-started server!’)
state.server.start()
state.stage = _ServerStage.STARTED
_request_call(state)

    thread = threading.Thread(target=_serve, args=(state,))
    thread.daemon = True
    thread.start()
    <a href="https://www.github.com/users/cecqa72/projects/730">https://www.github.com/users/cecqa72/projects/730</a>

https://github.com/users/cecqa72/projects/731
https://www.github.com/users/cecqa72/projects/731
https://github.com/users/cecqa72/projects/732
https://www.github.com/users/cecqa72/projects/732
https://github.com/users/cecqa72/projects/733
https://www.github.com/users/cecqa72/projects/733
https://github.com/users/cecqa72/projects/734
https://www.github.com/users/cecqa72/projects/734
https://github.com/users/cecqa72/projects/735
https://www.github.com/users/cecqa72/projects/735
https://github.com/users/cecqa72/projects/736
https://www.github.com/users/cecqa72/projects/736
https://github.com/users/cecqa72/projects/737
https://www.github.com/users/cecqa72/projects/737
https://github.com/users/cecqa72/projects/738
https://www.github.com/users/cecqa72/projects/738
https://github.com/users/cecqa72/projects/739
https://www.github.com/users/cecqa72/projects/739
https://github.com/users/cecqa72/projects/740
https://www.github.com/users/cecqa72/projects/740
https://github.com/users/cecqa72/projects/741
https://www.github.com/users/cecqa72/projects/741
https://github.com/users/cecqa72/projects/742
https://www.github.com/users/cecqa72/projects/742
https://github.com/users/cecqa72/projects/743
https://www.github.com/users/cecqa72/projects/743
https://github.com/users/cecqa72/projects/744
https://www.github.com/users/cecqa72/projects/744
https://github.com/users/cecqa72/projects/745
https://www.github.com/users/cecqa72/projects/745
https://github.com/users/cecqa72/projects/746
https://www.github.com/users/cecqa72/projects/746
https://github.com/users/cecqa72/projects/747
https://www.github.com/users/cecqa72/projects/747
https://github.com/users/cecqa72/projects/748
https://www.github.com/users/cecqa72/projects/748
https://github.com/users/cecqa72/projects/749
https://www.github.com/users/cecqa72/projects/749
https://github.com/users/cecqa72/projects/750
https://www.github.com/users/cecqa72/projects/750
https://github.com/users/cecqa72/projects/751
https://www.github.com/users/cecqa72/projects/751
https://github.com/users/cecqa72/projects/752
https://www.github.com/users/cecqa72/projects/752
https://github.com/users/cecqa72/projects/753
https://www.github.com/users/cecqa72/projects/753
https://github.com/users/cecqa72/projects/754
https://www.github.com/users/cecqa72/projects/754
https://github.com/users/cecqa72/projects/755
https://www.github.com/users/cecqa72/projects/755
https://github.com/users/cecqa72/projects/756
https://www.github.com/users/cecqa72/projects/756
https://github.com/users/cecqa72/projects/757
https://www.github.com/users/cecqa72/projects/757
https://github.com/users/cecqa72/projects/758
https://www.github.com/users/cecqa72/projects/758
https://github.com/users/cecqa72/projects/759
https://www.github.com/users/cecqa72/projects/759
https://github.com/users/cecqa72/projects/760
https://www.github.com/users/cecqa72/projects/760
https://github.com/users/cecqa72/projects/761
https://www.github.com/users/cecqa72/projects/761
https://github.com/users/cecqa72/projects/762
https://www.github.com/users/cecqa72/projects/762
https://github.com/users/cecqa72/projects/763
https://www.github.com/users/cecqa72/projects/763
https://github.com/users/cecqa72/projects/764
https://www.github.com/users/cecqa72/projects/764
https://github.com/users/cecqa72/projects/765
https://www.github.com/users/cecqa72/projects/765
https://github.com/users/cecqa72/projects/766
https://www.github.com/users/cecqa72/projects/766
https://github.com/users/cecqa72/projects/767
https://www.github.com/users/cecqa72/projects/767
https://github.com/users/cecqa72/projects/768
https://www.github.com/users/cecqa72/projects/768
https://github.com/users/cecqa72/projects/769
https://www.github.com/users/cecqa72/projects/769
https://github.com/users/cecqa72/projects/770
https://www.github.com/users/cecqa72/projects/770
https://github.com/users/cecqa72/projects/771
https://www.github.com/users/cecqa72/projects/771
https://github.com/users/cecqa72/projects/772
https://www.github.com/users/cecqa72/projects/772
https://github.com/users/cecqa72/projects/773
https://www.github.com/users/cecqa72/projects/773
https://github.com/users/cecqa72/projects/774
https://www.github.com/users/cecqa72/projects/774
https://github.com/users/cecqa72/projects/775
https://www.github.com/users/cecqa72/projects/775
https://github.com/users/cecqa72/projects/776
https://www.github.com/users/cecqa72/projects/776
https://github.com/users/cecqa72/projects/777
https://www.github.com/users/cecqa72/projects/777
https://github.com/users/cecqa72/projects/778
https://www.github.com/users/cecqa72/projects/778
https://github.com/users/cecqa72/projects/779
https://www.github.com/users/cecqa72/projects/779
https://github.com/users/cecqa72/projects/780
https://www.github.com/users/cecqa72/projects/780
https://github.com/users/cecqa72/projects/781
https://www.github.com/users/cecqa72/projects/781
https://github.com/users/cecqa72/projects/782
https://www.github.com/users/cecqa72/projects/782
https://github.com/users/cecqa72/projects/783
https://www.github.com/users/cecqa72/projects/783
https://github.com/users/cecqa72/projects/784
https://www.github.com/users/cecqa72/projects/784
https://github.com/users/cecqa72/projects/785
https://www.github.com/users/cecqa72/projects/785
https://github.com/users/cecqa72/projects/786
https://www.github.com/users/cecqa72/projects/786
https://github.com/users/cecqa72/projects/787
https://www.github.com/users/cecqa72/projects/787
https://github.com/users/cecqa72/projects/788
https://www.github.com/users/cecqa72/projects/788
https://github.com/users/cecqa72/projects/789
https://www.github.com/users/cecqa72/projects/789
https://github.com/users/cecqa72/projects/790
https://www.github.com/users/cecqa72/projects/790
https://github.com/users/cecqa72/projects/791
https://www.github.com/users/cecqa72/projects/791
https://github.com/users/cecqa72/projects/792
https://www.github.com/users/cecqa72/projects/792
https://github.com/users/cecqa72/projects/793
https://www.github.com/users/cecqa72/projects/793
https://github.com/users/cecqa72/projects/794
https://www.github.com/users/cecqa72/projects/794
https://github.com/users/cecqa72/projects/795
https://www.github.com/users/cecqa72/projects/795
https://github.com/users/cecqa72/projects/796
https://www.github.com/users/cecqa72/projects/796
https://github.com/users/cecqa72/projects/797
https://www.github.com/users/cecqa72/projects/797
https://github.com/users/cecqa72/projects/798
https://www.github.com/users/cecqa72/projects/798
https://github.com/users/cecqa72/projects/799
https://www.github.com/users/cecqa72/projects/799
https://github.com/users/cecqa72/projects/800
https://www.github.com/users/cecqa72/projects/800
https://github.com/users/cecqa72/projects/801
https://www.github.com/users/cecqa72/projects/801
https://github.com/users/cecqa72/projects/802
https://www.github.com/users/cecqa72/projects/802
https://github.com/users/cecqa72/projects/803
https://www.github.com/users/cecqa72/projects/803
https://github.com/users/cecqa72/projects/804
https://www.github.com/users/cecqa72/projects/804
https://github.com/users/cecqa72/projects/805
https://www.github.com/users/cecqa72/projects/805
https://github.com/users/cecqa72/projects/806
https://www.github.com/users/cecqa72/projects/806
https://github.com/users/cecqa72/projects/807
https://www.github.com/users/cecqa72/projects/807
https://github.com/users/cecqa72/projects/808
https://www.github.com/users/cecqa72/projects/808
https://github.com/users/cecqa72/projects/809
https://www.github.com/users/cecqa72/projects/809
https://github.com/users/cecqa72/projects/810
https://www.github.com/users/cecqa72/projects/810
https://github.com/users/cecqa72/projects/811
https://www.github.com/users/cecqa72/projects/811
https://github.com/users/cecqa72/projects/812
https://www.github.com/users/cecqa72/projects/812
https://github.com/users/cecqa72/projects/813
https://www.github.com/users/cecqa72/projects/813
https://github.com/users/cecqa72/projects/814
https://www.github.com/users/cecqa72/projects/814
https://github.com/users/cecqa72/projects/815
https://www.github.com/users/cecqa72/projects/815
https://github.com/users/cecqa72/projects/816
https://www.github.com/users/cecqa72/projects/816
https://github.com/users/cecqa72/projects/817
https://www.github.com/users/cecqa72/projects/817
https://github.com/users/cecqa72/projects/818
https://www.github.com/users/cecqa72/projects/818
https://github.com/users/cecqa72/projects/819
https://www.github.com/users/cecqa72/projects/819
https://github.com/users/cecqa72/projects/820
https://www.github.com/users/cecqa72/projects/820
https://github.com/users/cecqa72/projects/821
https://www.github.com/users/cecqa72/projects/821
https://github.com/users/cecqa72/projects/822
https://www.github.com/users/cecqa72/projects/822
https://github.com/users/cecqa72/projects/823
https://www.github.com/users/cecqa72/projects/823
https://github.com/users/cecqa72/projects/824
https://www.github.com/users/cecqa72/projects/824
https://github.com/users/cecqa72/projects/825
https://www.github.com/users/cecqa72/projects/825
https://github.com/users/cecqa72/projects/826
https://www.github.com/users/cecqa72/projects/826
https://github.com/users/cecqa72/projects/827
https://www.github.com/users/cecqa72/projects/827
https://github.com/users/cecqa72/projects/828
https://www.github.com/users/cecqa72/projects/828
https://github.com/users/cecqa72/projects/829
https://www.github.com/users/cecqa72/projects/829
https://github.com/users/cecqa72/projects/830
https://www.github.com/users/cecqa72/projects/830
https://github.com/users/cecqa72/projects/831
https://www.github.com/users/cecqa72/projects/831
https://github.com/users/cecqa72/projects/832
https://www.github.com/users/cecqa72/projects/832
https://github.com/users/cecqa72/projects/833
https://www.github.com/users/cecqa72/projects/833
https://github.com/users/cecqa72/projects/834
https://www.github.com/users/cecqa72/projects/834
https://github.com/users/cecqa72/projects/835
https://www.github.com/users/cecqa72/projects/835
https://github.com/users/cecqa72/projects/836
https://www.github.com/users/cecqa72/projects/836
https://github.com/users/cecqa72/projects/837
https://www.github.com/users/cecqa72/projects/837
https://github.com/users/cecqa72/projects/838
https://www.github.com/users/cecqa72/projects/838
https://github.com/users/cecqa72/projects/839
https://www.github.com/users/cecqa72/projects/839
https://github.com/users/cecqa72/projects/840
https://www.github.com/users/cecqa72/projects/840
https://github.com/users/cecqa72/projects/841
https://www.github.com/users/cecqa72/projects/841
https://github.com/users/cecqa72/projects/842
https://www.github.com/users/cecqa72/projects/842
https://github.com/users/cecqa72/projects/843
https://www.github.com/users/cecqa72/projects/843
https://github.com/users/cecqa72/projects/844
https://www.github.com/users/cecqa72/projects/844
https://github.com/users/cecqa72/projects/845
https://www.github.com/users/cecqa72/projects/845
https://github.com/users/cecqa72/projects/846
https://www.github.com/users/cecqa72/projects/846
https://github.com/users/cecqa72/projects/847
https://www.github.com/users/cecqa72/projects/847
https://github.com/users/cecqa72/projects/848
https://www.github.com/users/cecqa72/projects/848
https://github.com/users/cecqa72/projects/849
https://www.github.com/users/cecqa72/projects/849
https://github.com/users/cecqa72/projects/850
https://www.github.com/users/cecqa72/projects/850
https://github.com/users/cecqa72/projects/851
https://www.github.com/users/cecqa72/projects/851
https://github.com/users/cecqa72/projects/852
https://www.github.com/users/cecqa72/projects/852
https://github.com/users/cecqa72/projects/853
https://www.github.com/users/cecqa72/projects/853
https://github.com/users/cecqa72/projects/854
https://www.github.com/users/cecqa72/projects/854
https://github.com/users/cecqa72/projects/855
https://www.github.com/users/cecqa72/projects/855
https://github.com/users/cecqa72/projects/856
https://www.github.com/users/cecqa72/projects/856
https://github.com/users/cecqa72/projects/857
https://www.github.com/users/cecqa72/projects/857
https://github.com/users/cecqa72/projects/858
https://www.github.com/users/cecqa72/projects/858
https://github.com/users/cecqa72/projects/859
https://www.github.com/users/cecqa72/projects/859
https://github.com/users/cecqa72/projects/860
https://www.github.com/users/cecqa72/projects/860
https://github.com/users/cecqa72/projects/861
https://www.github.com/users/cecqa72/projects/861
https://github.com/users/cecqa72/projects/862
https://www.github.com/users/cecqa72/projects/862
https://github.com/users/cecqa72/projects/863
https://www.github.com/users/cecqa72/projects/863
https://github.com/users/cecqa72/projects/864
https://www.github.com/users/cecqa72/projects/864
https://github.com/users/cecqa72/projects/865
https://www.github.com/users/cecqa72/projects/865
https://github.com/users/cecqa72/projects/866
https://www.github.com/users/cecqa72/projects/866
https://github.com/users/cecqa72/projects/867
https://www.github.com/users/cecqa72/projects/867
https://github.com/users/cecqa72/projects/868
https://www.github.com/users/cecqa72/projects/868
https://github.com/users/cecqa72/projects/869
https://www.github.com/users/cecqa72/projects/869
https://github.com/users/cecqa72/projects/870
https://www.github.com/users/cecqa72/projects/870
https://github.com/users/cecqa72/projects/871
https://www.github.com/users/cecqa72/projects/871
https://github.com/users/cecqa72/projects/872
https://www.github.com/users/cecqa72/projects/872
https://github.com/users/cecqa72/projects/873
https://www.github.com/users/cecqa72/projects/873
https://github.com/users/cecqa72/projects/874
https://www.github.com/users/cecqa72/projects/874
https://github.com/users/cecqa72/projects/875
https://www.github.com/users/cecqa72/projects/875
https://github.com/users/cecqa72/projects/876
https://www.github.com/users/cecqa72/projects/876
https://github.com/users/cecqa72/projects/877
https://www.github.com/users/cecqa72/projects/877
https://github.com/users/cecqa72/projects/878
https://www.github.com/users/cecqa72/projects/878
https://github.com/users/cecqa72/projects/879
https://www.github.com/users/cecqa72/projects/879
https://github.com/users/cecqa72/projects/880
https://www.github.com/users/cecqa72/projects/880
https://github.com/users/cecqa72/projects/881
https://www.github.com/users/cecqa72/projects/881
https://github.com/users/cecqa72/projects/882
https://www.github.com/users/cecqa72/projects/882
https://github.com/users/cecqa72/projects/883
https://www.github.com/users/cecqa72/projects/883
https://github.com/users/cecqa72/projects/884
https://www.github.com/users/cecqa72/projects/884
https://github.com/users/cecqa72/projects/885
https://www.github.com/users/cecqa72/projects/885
https://github.com/users/cecqa72/projects/886
https://www.github.com/users/cecqa72/projects/886
https://github.com/users/cecqa72/projects/887
https://www.github.com/users/cecqa72/projects/887
https://github.com/users/cecqa72/projects/888
https://www.github.com/users/cecqa72/projects/888
https://github.com/users/cecqa72/projects/889
https://www.github.com/users/cecqa72/projects/889
https://github.com/users/cecqa72/projects/890
https://www.github.com/users/cecqa72/projects/890
https://github.com/users/cecqa72/projects/891
https://www.github.com/users/cecqa72/projects/891
https://github.com/users/cecqa72/projects/892
https://www.github.com/users/cecqa72/projects/892
https://github.com/users/cecqa72/projects/893
https://www.github.com/users/cecqa72/projects/893
https://github.com/users/cecqa72/projects/894
https://www.github.com/users/cecqa72/projects/894
https://github.com/users/cecqa72/projects/895
https://www.github.com/users/cecqa72/projects/895
https://github.com/users/cecqa72/projects/896
https://www.github.com/users/cecqa72/projects/896
https://github.com/users/cecqa72/projects/897
https://www.github.com/users/cecqa72/projects/897
https://github.com/users/cecqa72/projects/898
https://www.github.com/users/cecqa72/projects/898
https://github.com/users/cecqa72/projects/899
https://www.github.com/users/cecqa72/projects/899
https://github.com/users/cecqa72/projects/900
https://www.github.com/users/cecqa72/projects/900
https://github.com/users/cecqa72/projects/901
https://www.github.com/users/cecqa72/projects/901
https://github.com/users/cecqa72/projects/902
https://www.github.com/users/cecqa72/projects/902
https://github.com/users/cecqa72/projects/903
https://www.github.com/users/cecqa72/projects/903
https://github.com/users/cecqa72/projects/904
https://www.github.com/users/cecqa72/projects/904
https://github.com/users/cecqa72/projects/905
https://www.github.com/users/cecqa72/projects/905
https://github.com/users/cecqa72/projects/906
https://www.github.com/users/cecqa72/projects/906
https://github.com/users/cecqa72/projects/907
https://www.github.com/users/cecqa72/projects/907
https://github.com/users/cecqa72/projects/908
https://www.github.com/users/cecqa72/projects/908
https://github.com/users/cecqa72/projects/909
https://www.github.com/users/cecqa72/projects/909
https://github.com/users/cecqa72/projects/910
https://www.github.com/users/cecqa72/projects/910
https://github.com/users/cecqa72/projects/911
https://www.github.com/users/cecqa72/projects/911
https://github.com/users/cecqa72/projects/912
https://www.github.com/users/cecqa72/projects/912
https://github.com/users/cecqa72/projects/913
https://www.github.com/users/cecqa72/projects/913
https://github.com/users/cecqa72/projects/914
https://www.github.com/users/cecqa72/projects/914
https://github.com/users/cecqa72/projects/915
https://www.github.com/users/cecqa72/projects/915
https://github.com/users/cecqa72/projects/916
https://www.github.com/users/cecqa72/projects/916
https://github.com/users/cecqa72/projects/917
https://www.github.com/users/cecqa72/projects/917
https://github.com/users/cecqa72/projects/918
https://www.github.com/users/cecqa72/projects/918
https://github.com/users/cecqa72/projects/919
https://www.github.com/users/cecqa72/projects/919
https://github.com/users/cecqa72/projects/920
https://www.github.com/users/cecqa72/projects/920
https://github.com/users/cecqa72/projects/921
https://www.github.com/users/cecqa72/projects/921
https://github.com/users/cecqa72/projects/922
https://www.github.com/users/cecqa72/projects/922
https://github.com/users/cecqa72/projects/923
https://www.github.com/users/cecqa72/projects/923
https://github.com/users/cecqa72/projects/924
https://www.github.com/users/cecqa72/projects/924
https://github.com/users/cecqa72/projects/925
https://www.github.com/users/cecqa72/projects/925
https://github.com/users/cecqa72/projects/926
https://www.github.com/users/cecqa72/projects/926
https://github.com/users/cecqa72/projects/927
https://www.github.com/users/cecqa72/projects/927
https://github.com/users/cecqa72/projects/928
https://www.github.com/users/cecqa72/projects/928
https://github.com/users/cecqa72/projects/929
https://www.github.com/users/cecqa72/projects/929
https://github.com/users/cecqa72/projects/930
https://www.github.com/users/cecqa72/projects/930
https://github.com/users/cecqa72/projects/931
https://www.github.com/users/cecqa72/projects/931
https://github.com/users/cecqa72/projects/932
https://www.github.com/users/cecqa72/projects/932
https://github.com/users/cecqa72/projects/933
https://www.github.com/users/cecqa72/projects/933
https://github.com/users/cecqa72/projects/934
https://www.github.com/users/cecqa72/projects/934
https://github.com/users/cecqa72/projects/935
https://www.github.com/users/cecqa72/projects/935
https://github.com/users/cecqa72/projects/936
https://www.github.com/users/cecqa72/projects/936
https://github.com/users/cecqa72/projects/937
https://www.github.com/users/cecqa72/projects/937
https://github.com/users/cecqa72/projects/938
https://www.github.com/users/cecqa72/projects/938
https://github.com/users/cecqa72/projects/939
https://www.github.com/users/cecqa72/projects/939
https://github.com/users/cecqa72/projects/940
https://www.github.com/users/cecqa72/projects/940
https://github.com/users/cecqa72/projects/941
https://www.github.com/users/cecqa72/projects/941
https://github.com/users/cecqa72/projects/942
https://www.github.com/users/cecqa72/projects/942
https://github.com/users/cecqa72/projects/943
https://www.github.com/users/cecqa72/projects/943
https://github.com/users/cecqa72/projects/944
https://www.github.com/users/cecqa72/projects/944
https://github.com/users/cecqa72/projects/945
https://www.github.com/users/cecqa72/projects/945
https://github.com/users/cecqa72/projects/946
https://www.github.com/users/cecqa72/projects/946
https://github.com/users/cecqa72/projects/947
https://www.github.com/users/cecqa72/projects/947
https://github.com/users/cecqa72/projects/948
https://www.github.com/users/cecqa72/projects/948
https://github.com/users/cecqa72/projects/949
https://www.github.com/users/cecqa72/projects/949
https://github.com/users/cecqa72/projects/950
https://www.github.com/users/cecqa72/projects/950
https://github.com/users/cecqa72/projects/951
https://www.github.com/users/cecqa72/projects/951
https://github.com/users/cecqa72/projects/952
https://www.github.com/users/cecqa72/projects/952
https://github.com/users/cecqa72/projects/953
https://www.github.com/users/cecqa72/projects/953
https://github.com/users/cecqa72/projects/954
https://www.github.com/users/cecqa72/projects/954
https://github.com/users/cecqa72/projects/955
https://www.github.com/users/cecqa72/projects/955
https://github.com/users/cecqa72/projects/956
https://www.github.com/users/cecqa72/projects/956
https://github.com/users/cecqa72/projects/957
https://www.github.com/users/cecqa72/projects/957
https://github.com/users/cecqa72/projects/958
https://www.github.com/users/cecqa72/projects/958
https://github.com/users/cecqa72/projects/959
https://www.github.com/users/cecqa72/projects/959
https://github.com/users/cecqa72/projects/960
https://www.github.com/users/cecqa72/projects/960
https://github.com/users/cecqa72/projects/961
https://www.github.com/users/cecqa72/projects/961
https://github.com/users/cecqa72/projects/962
https://www.github.com/users/cecqa72/projects/962
https://github.com/users/cecqa72/projects/963
https://www.github.com/users/cecqa72/projects/963
https://github.com/users/cecqa72/projects/964
https://www.github.com/users/cecqa72/projects/964
https://github.com/users/cecqa72/projects/965
https://www.github.com/users/cecqa72/projects/965
https://github.com/users/cecqa72/projects/966
https://www.github.com/users/cecqa72/projects/966
https://github.com/users/cecqa72/projects/967
https://www.github.com/users/cecqa72/projects/967
https://github.com/users/cecqa72/projects/968
https://www.github.com/users/cecqa72/projects/968
https://github.com/users/cecqa72/projects/969
https://www.github.com/users/cecqa72/projects/969
https://github.com/users/cecqa72/projects/970
https://www.github.com/users/cecqa72/projects/970
https://github.com/users/cecqa72/projects/971
https://www.github.com/users/cecqa72/projects/971
https://github.com/users/cecqa72/projects/972
https://www.github.com/users/cecqa72/projects/972
https://github.com/users/cecqa72/projects/973
https://www.github.com/users/cecqa72/projects/973
https://github.com/users/cecqa72/projects/974
https://www.github.com/users/cecqa72/projects/974
https://github.com/users/cecqa72/projects/975
https://www.github.com/users/cecqa72/projects/975
https://github.com/users/cecqa72/projects/976
https://www.github.com/users/cecqa72/projects/976
https://github.com/users/cecqa72/projects/977
https://www.github.com/users/cecqa72/projects/977
https://github.com/users/cecqa72/projects/978
https://www.github.com/users/cecqa72/projects/978
https://github.com/users/cecqa72/projects/979
https://www.github.com/users/cecqa72/projects/979
https://github.com/users/cecqa72/projects/980
https://www.github.com/users/cecqa72/projects/980
https://github.com/users/cecqa72/projects/981
https://www.github.com/users/cecqa72/projects/981
https://github.com/users/cecqa72/projects/982
https://www.github.com/users/cecqa72/projects/982
https://github.com/users/cecqa72/projects/983
https://www.github.com/users/cecqa72/projects/983
https://github.com/users/cecqa72/projects/984
https://www.github.com/users/cecqa72/projects/984
https://github.com/users/cecqa72/projects/985
https://www.github.com/users/cecqa72/projects/985
https://github.com/users/cecqa72/projects/986
https://www.github.com/users/cecqa72/projects/986
https://github.com/users/cecqa72/projects/987
https://www.github.com/users/cecqa72/projects/987
https://github.com/users/cecqa72/projects/988
https://www.github.com/users/cecqa72/projects/988
https://github.com/users/cecqa72/projects/989
https://www.github.com/users/cecqa72/projects/989
https://github.com/users/cecqa72/projects/990
https://www.github.com/users/cecqa72/projects/990
https://github.com/users/cecqa72/projects/991
https://www.github.com/users/cecqa72/projects/991
https://github.com/users/cecqa72/projects/992
https://www.github.com/users/cecqa72/projects/992
https://github.com/users/cecqa72/projects/993
https://www.github.com/users/cecqa72/projects/993
https://github.com/users/cecqa72/projects/994
https://www.github.com/users/cecqa72/projects/994
https://github.com/users/cecqa72/projects/995
https://www.github.com/users/cecqa72/projects/995
https://github.com/users/cecqa72/projects/996
https://www.github.com/users/cecqa72/projects/996
https://github.com/users/cecqa72/projects/997
https://www.github.com/users/cecqa72/projects/997
https://github.com/users/cecqa72/projects/998
https://www.github.com/users/cecqa72/projects/998
https://github.com/users/cecqa72/projects/999
https://www.github.com/users/cecqa72/projects/999
https://github.com/users/cecqa72/projects/1000
https://www.github.com/users/cecqa72/projects/1000
https://github.com/users/cecqa72/projects/1001
https://www.github.com/users/cecqa72/projects/1001
https://github.com/users/cecqa72/projects/1002
https://www.github.com/users/cecqa72/projects/1002
https://github.com/users/cecqa72/projects/1003
https://www.github.com/users/cecqa72/projects/1003
https://github.com/users/cecqa72/projects/1004
https://www.github.com/users/cecqa72/projects/1004
https://github.com/users/cecqa72/projects/1005
https://www.github.com/users/cecqa72/projects/1005
https://github.com/users/cecqa72/projects/1006
https://www.github.com/users/cecqa72/projects/1006
https://github.com/users/cecqa72/projects/1007
https://www.github.com/users/cecqa72/projects/1007
https://github.com/users/cecqa72/projects/1008
https://www.github.com/users/cecqa72/projects/1008
https://github.com/users/cecqa72/projects/1009
https://www.github.com/users/cecqa72/projects/1009
https://github.com/users/cecqa72/projects/1010
https://www.github.com/users/cecqa72/projects/1010
https://github.com/users/cecqa72/projects/1011
https://www.github.com/users/cecqa72/projects/1011
https://github.com/users/cecqa72/projects/1012
https://www.github.com/users/cecqa72/projects/1012
https://github.com/users/cecqa72/projects/1013
https://www.github.com/users/cecqa72/projects/1013
https://github.com/users/cecqa72/projects/1014
https://www.github.com/users/cecqa72/projects/1014
https://github.com/users/cecqa72/projects/1015
https://www.github.com/users/cecqa72/projects/1015
https://github.com/users/cecqa72/projects/1016
https://www.github.com/users/cecqa72/projects/1016
https://github.com/users/cecqa72/projects/1017
https://www.github.com/users/cecqa72/projects/1017
https://github.com/users/cecqa72/projects/1018
https://www.github.com/users/cecqa72/projects/1018
https://github.com/users/cecqa72/projects/1019
https://www.github.com/users/cecqa72/projects/1019
https://github.com/users/cecqa72/projects/1020
https://www.github.com/users/cecqa72/projects/1020
https://github.com/users/cecqa72/projects/1021
https://www.github.com/users/cecqa72/projects/1021
https://github.com/users/cecqa72/projects/1022
https://www.github.com/users/cecqa72/projects/1022
https://github.com/users/cecqa72/projects/1023
https://www.github.com/users/cecqa72/projects/1023
https://github.com/users/cecqa72/projects/1024
https://www.github.com/users/cecqa72/projects/1024
https://github.com/users/cecqa72/projects/1025
https://www.github.com/users/cecqa72/projects/1025
https://github.com/users/cecqa72/projects/1026
https://www.github.com/users/cecqa72/projects/1026
https://github.com/users/cecqa72/projects/1027
https://www.github.com/users/cecqa72/projects/1027
https://github.com/users/cecqa72/projects/1028
https://www.github.com/users/cecqa72/projects/1028
https://github.com/users/cecqa72/projects/1029
https://www.github.com/users/cecqa72/projects/1029
https://github.com/users/cecqa72/projects/1030
https://www.github.com/users/cecqa72/projects/1030
https://github.com/users/cecqa72/projects/1031
https://www.github.com/users/cecqa72/projects/1031
https://github.com/users/cecqa72/projects/1032
https://www.github.com/users/cecqa72/projects/1032
https://github.com/users/cecqa72/projects/1033
https://www.github.com/users/cecqa72/projects/1033
https://github.com/users/cecqa72/projects/1034
https://www.github.com/users/cecqa72/projects/1034
https://github.com/users/cecqa72/projects/1035
https://www.github.com/users/cecqa72/projects/1035
https://github.com/users/cecqa72/projects/1036
https://www.github.com/users/cecqa72/projects/1036
https://github.com/users/cecqa72/projects/1037
https://www.github.com/users/cecqa72/projects/1037
https://github.com/users/cecqa72/projects/1038
https://www.github.com/users/cecqa72/projects/1038
https://github.com/users/cecqa72/projects/1039
https://www.github.com/users/cecqa72/projects/1039
https://github.com/users/cecqa72/projects/1040
https://www.github.com/users/cecqa72/projects/1040
https://github.com/users/cecqa72/projects/1041
https://www.github.com/users/cecqa72/projects/1041
https://github.com/users/cecqa72/projects/1042

相關文章