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。如果您需要从十个套接字读取,只需生成十个绿色线程。例如:结果 = Group().map(lambda s: s.read(), my_sockets)
  • 虽然我们在这里:使用起来很奇怪data = str()-data = ""会更加标准。
于 2012-06-12T06:20:34.237 回答