0

基本的に、同時ソケットスレッドに対してスレッドを正しく実装したかどうかを知りたいだけです。これが私のアプローチです:

#!/usr/bin/env python
import sys
import time
from gevent import socket, Timeout, select
from gevent.pool import Pool

def worker(website):
    data = str()
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.setblocking(0)
    s.connect(('google.com',80))
    s.send('HEAD / HTTP/1.1\n\n')

    while True:
        read, w, e = select.select([s], [], [])
        if read:
            data = s.recv(1024)
            if data:
                break

    print ('done')
    return 0

def main():

    pool = Pool(10)
    for item in items:
            pool.spawn(worker, item)
    pool.join()
4

1 に答える 1

1

ねじ切り部分 ( pool.spawn) は問題ありません (ただしGroup.map(またはimap、またはimap_unorderedさらにきれいになる可能性があります)。

ただし、select完全に不要です。のパッチが適用されたソケットを使用しているためgevent、次を使用できます。

data = s.recv(1024)

その他のいくつかのこと:

  • setblockingそのようにしている場合は、への呼び出しは必要ありません。
  • 完全に正しくするには、を使用する必要がありますsocket.sendall
  • を使用geventすると、ほとんどありませんselect。10 個のソケットから読み取る必要がある場合は、10 個の緑色のスレッドを生成するだけです。例: 結果 = Group().map(lambda s: s.read(), my_sockets).
  • 私たちがここにいる間: 使用するのは非常に奇妙ですdata = str()data = ""はるかに標準的です.
于 2012-06-12T06:20:34.237 に答える