基本上我只是想知道我是否为并发套接字线程正确实现了线程。这是我的方法:
#!/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()
答案 0 :(得分:1)
线程部分(pool.spawn
)很好(虽然Group.map
(或imap
或imap_unordered
可能更漂亮)。
select
完全没必要。由于您使用的是gevent
修补套接字,因此您可以使用:
data = s.recv(1024)
其他一些事情:
setblocking
的电话。socket.sendall
。gevent
,您几乎不会select
。如果你需要读取十个插座,只需生成十个绿色线程。例如:results = Group().map(lambda s: s.read(), my_sockets)
。data = str()
非常奇怪 - data = ""
会更加标准化。