別のスレッドで実行するか、組み込みのasyncoreライブラリを使用する必要があります。 ほとんどのライブラリは、あなたが知らなくてもスレッドを利用したり、Pythonの標準的な部分であるasyncoreに依存します。ここで
は、スレッドとasyncoreの組み合わせです:
#!/usr/bin/python
# -*- coding: iso-8859-15 -*-
import asyncore, socket
from threading import *
from time import sleep
from os import _exit
from logger import * # <- Non-standard library containing a log function
from config import * # <- Non-standard library containing settings such as "server"
class logDispatcher(Thread, asyncore.dispatcher):
def __init__(self, config=None):
self.inbuffer = ''
self.buffer = ''
self.lockedbuffer = False
self.is_writable = False
self.is_connected = False
self.exit = False
self.initated = False
asyncore.dispatcher.__init__(self)
Thread.__init__(self)
self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
try:
self.connect((server, server_port))
except:
log('Could not connect to ' + server, 'LOG_SOCK')
return None
self.start()
def handle_connect_event(self):
self.is_connected = True
def handle_connect(self):
self.is_connected = True
log('Connected to ' + str(server), 'LOG_SOCK')
def handle_close(self):
self.is_connected = False
self.close()
def handle_read(self):
data = self.recv(8192)
while self.lockedbuffer:
sleep(0.01)
self.inbuffer += data
def handle_write(self):
while self.is_writable:
sent = self.send(self.buffer)
sleep(1)
self.buffer = self.buffer[sent:]
if len(self.buffer) <= 0:
self.is_writable = False
sleep(0.01)
def _send(self, what):
self.buffer += what + '\r\n'
self.is_writable = True
def run(self):
self._send('GET/HTTP/1.1\r\n')
while 1:
logDispatcher() # <- Initate one for each request.
asyncore.loop(0.1)
log('All threads are done, next loop in 10', 'CORE')
sleep(10)
それとも、単に仕事をして、その後、死亡したスレッドを行うことができます。
from threading import *
class worker(Thread):
def __init__(self, host, postdata)
Thread.__init__(self)
self.host = host
self.postdata = postdata
self.start()
def run(self):
sock.send(self.postdata) #Pseudo, create the socket!
for data in postDataObjects:
worker('example.com', data)
(あなたは5kの支柱の上、送信しているか、それがシステムに負担をかけてしまうかもしれません場合)は、スレッドの数を制限する必要がある場合だけwhile len(enumerate()) > 1000: sleep(0.1)
を行うと、ルーパーオブジェクトは、数のスレッドを待ちましょう消える。
[asyncore](http://docs.python.org/2/library/asyncore.html)と呼ばれる標準のライブラリがありますが、使用するケースが低すぎる可能性があります。 – lucasg
私はこれに@georgeslと同意する必要があります。asyncoreは、後で開発するためにアプリケーションよりも優れた柔軟性を与えるため、移行するのに最適な場所です。また、http:// stackoverflow.com/questions/15753901/python-asyncore-client-socket-can-not-determaine-connection-status/15754244#15754244'の使い方の良いスタートと例です私の質問に対する答えを見てください)。そうでない場合は、実際に複数のプロセスで実行する必要があります。たとえ、Pythonの "サブ"ライブラリでも、マルチプロセスの要点であるパラレルを送ることができます。 – Torxed
あなたのgeventコードは大丈夫ですクイックテストではうまくいくと私にはわかります;私はgevent 1.0b3を使います)。私は 'execute_task'が呼び出されるコンテキストに依存すると思います。 – robertklep