python Queue一般用于哪些方面,这段代码大概是什么流程意思,谢谢
PHPz
PHPz 2017-04-17 18:00:48
0
2
276
from ccnet.sync_client import SyncClient
import Queue

class ClientPool(object):
    """ccnet client pool."""

    def __init__(self, conf_dir, pool_size=5):
        """
        :param conf_dir: the ccnet configuration directory
        :param pool_size:
        """
        self.conf_dir = conf_dir
        self.pool_size = pool_size
        self._pool = Queue.Queue(pool_size)

    def _create_client(self):
        client = SyncClient(self.conf_dir)
        client.req_ids = {}
        client.connect_daemon()

        return client

    def get_client(self):
        try:
            client = self._pool.get(False)
        except:
            client = self._create_client()
        return client

    def return_client(self, client):
        try:
            self._pool.put(client, False)
        except Queue.Full:
            pass
class SyncClient(Client):
    '''sync mode client'''
    def __init__(self, config_dir):
        Client.__init__(self, config_dir)
        self._req_id = _REQ_ID_START
        self.mq_req_id = -1

    def disconnect_daemon(self):
        if self.is_connected():
            try:
                self._connfd.close()
            except:
                pass

    def read_response(self):
        packet = read_packet(self._connfd)
        if packet.header.ptype != CCNET_MSG_RESPONSE:
            raise RuntimeError('Invalid Response')

        code, code_msg, content = parse_response(packet.body)

        return Response(code, code_msg, content)

    def send_cmd(self, cmd):
        req_id = self.get_request_id()
        self.send_request(req_id, 'receive-cmd')
        resp = self.read_response()
        if resp.code != '200':
            raise RuntimeError('Failed to send-cmd: %s %s' % (resp.code, resp.code_msg))

        cmd += '\000'
        self.send_update(req_id, '200', '', cmd)

        resp = self.read_response()
        if resp.code != '200':
            raise RuntimeError('Failed to send-cmd: %s %s' % (resp.code, resp.code_msg))

        self.send_update(req_id, SC_PROC_DONE, SS_PROC_DONE, '')

    def prepare_recv_message(self, msg_type):
        request = 'mq-server %s' % msg_type
        req_id = self.get_request_id()
        self.send_request(req_id, request)

        resp = self.read_response()
        if resp.code != '200':
            raise RuntimeError('bad response: %s %s' % (resp.code, resp.code_msg))

    def receive_message(self):
        resp = self.read_response()
        # the message from ccnet daemon has the trailing null byte included
        msg = message_from_string(resp.content[:-1])
        return msg

    def prepare_send_message(self):
        request = 'mq-server'
        mq_req_id = self.get_request_id()
        self.send_request(mq_req_id, request)
        resp = self.read_response()
        if resp.code != '200':
            raise RuntimeError('bad response: %s %s' % (resp.code, resp.code_msg))
        self.mq_req_id = mq_req_id

    def send_message(self, msg_type, content):
        if self.mq_req_id == -1:
            self.prepare_send_message()

        msg = gen_inner_message_string(self.peer_id, msg_type, content)
        self.send_update(self.mq_req_id, "300", '', msg)
        resp = self.read_response()
        if resp.code != '200':
            self.mq_req_id = -1
            raise RuntimeError('bad response: %s %s' % (resp.code, resp.code_msg))

    def register_service_sync(self, service, group):
        '''Mainly used by a program to register a dummy service to ensure only
        single instance of that program is running

        '''
        cmd = 'register-service %s %s' % (service, group)
        self.send_cmd(cmd)
PHPz
PHPz

学习是最好的投资!

membalas semua(2)
巴扎黑

Queue Saya jarang menggunakan struktur data ini, tetapi saya menyemak dokumentasi Python:

Modul Gilir melaksanakan baris gilir berbilang pengeluar, berbilang pengguna Ia amat berguna dalam pengaturcaraan berulir apabila maklumat mesti ditukar dengan selamat antara berbilang rangkaian dalam modul ini melaksanakan semua semantik penguncian yang diperlukan bergantung pada ketersediaan sokongan benang dalam Python; lihat modul benang.

Dokumen tersebut menyatakan bahawa ini adalah baris selamat benang, jadi ia boleh digunakan dalam persekitaran perlumbaan dengan berbilang pengeluar dan berbilang pengguna, yang biasa berlaku dalam pengaturcaraan berbilang benang.

Ini yang saya suka Queue Sekarang mari kita bincangkan tentang kod dalam soalan Ia boleh dilihat dengan jelas daripada nama bahawa kod ini ialah 客户端的池 Apabila anda perlu mendapatkan pelanggan, panggil kaedah get_client() dan ia akan mengembalikan SyncClientThe. pelanggan diberikan kepada anda. Apabila anda selesai dengannya, jangan lupa untuk menghubungi: return_client(client)Tukar semula, jika tidak, gelombang pelanggan yang besar akan dihasilkan di sini yang mewujudkan sejumlah besar pelanggan akan bermasalah.

Itu sahaja, saya tidak tahu sama ada penyoal memahaminya.

迷茫

Baris gilir adalah barisan yang selamat untuk kod yang diberikan, @yylucifer menjelaskannya dengan lebih jelas. Penggunaan ini adalah sangat biasa blockconnectionpool one pada asasnya adalah idea yang sama.redis-py

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan