我的线程方法是否有效?

时间:2012-06-12 05:19:59

标签: python sockets gevent

基本上我只是想知道我是否为并发套接字线程正确实现了线程。这是我的方法:

#!/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()

1 个答案:

答案 0 :(得分:1)

线程部分(pool.spawn)很好(虽然Group.map(或imapimap_unordered可能更漂亮)。

select完全没必要。由于您使用的是gevent修补套接字,因此您可以使用:

data = s.recv(1024)

其他一些事情:

  • 如果您这样做,您将无法拨打setblocking的电话。
  • 完全正确,您应该使用socket.sendall
  • 使用gevent,您几乎不会select。如果你需要读取十个插座,只需生成十个绿色线程。例如:results = Group().map(lambda s: s.read(), my_sockets)
  • 虽然我们在这里:使用data = str()非常奇怪 - data = ""会更加标准化。