Voor dat ik mijn probleem aan jullie voorleg, zal ik even uitleggen wat ik probeer te maken.
Project
Er moet een server komen die voor mensen kan inloggen op een IMAP server die PUSH (het IDLE commando) ondersteund. Deze push berichten kunnen dan worden doorgesluisd naar een ander protocol die de gebruikers op de hoogte stelt van de wijzigingen. Uiteraard wil ik dit zo efficient mogelijk maken, dus een thread per connectie is onacceptabel. Nu hebben we daarvoor de select() call, welke heel mooi wordt gebruikt in de asyncore module van Python. Één van de onderdelen van het IDLE commando, is dat deze elke 30 minuten opnieuw moet worden aangemeld. Ik moet dus per connectie gaan bijhouden wanneer het IDLE commando opnieuw moet worden verzonden.
Probleem
Het bijhouden van wanneer het IDLE commando opnieuw moet worden verzonden kan in Python met threading.Timer, maar dat ben ik weer een Thread per connectie kwijt, en dat kost weer veel resources.
Ideëen
Een mogelijkheid die ik zelf bedacht had was 1 Thread waar alle connecties in een lijst komen te staan, gegroepeerd per minuut. Deze thread kijkt dan elke minuut welke connecties er moeten worden vernieuwd, en voert dit dan uit. Mijn grootste bezwaar hierbij, is dat met bijvoorbeeld 10000 connecties, er eens per minuut meer dan 300 commando's achter elkaar worden verstuurd. Erg onregelmatig dus.
Andere mogelijkheden zijn het Twisted framework. Als ik het goed begrepen heb is het een framework waarmee je een soort event-driven programma's kunt schrijven. Helaas is dit weer niet platform onafhankelijk. En ook wil ik juist zo'n min mogelijk code gebruiken voor de server. De IMAP client heb ik dan ook zelf geschreven in plaat van een module te gebruiken.
Een andere oplossing is het gebruik van microthreads. Dit kan m.b.v. Stackless Python. Maar dit is weer een complete Python interpreter, welke nog experimenteel is ook.
Het liefst doe ik het natuurlijk zoals signal.alarm, of zoals ObjC volgens mij kan. Max 1 thread die gewoon voor de timers zorgt, en de bijbehorende functies aanroept.
Project
Er moet een server komen die voor mensen kan inloggen op een IMAP server die PUSH (het IDLE commando) ondersteund. Deze push berichten kunnen dan worden doorgesluisd naar een ander protocol die de gebruikers op de hoogte stelt van de wijzigingen. Uiteraard wil ik dit zo efficient mogelijk maken, dus een thread per connectie is onacceptabel. Nu hebben we daarvoor de select() call, welke heel mooi wordt gebruikt in de asyncore module van Python. Één van de onderdelen van het IDLE commando, is dat deze elke 30 minuten opnieuw moet worden aangemeld. Ik moet dus per connectie gaan bijhouden wanneer het IDLE commando opnieuw moet worden verzonden.
Probleem
Het bijhouden van wanneer het IDLE commando opnieuw moet worden verzonden kan in Python met threading.Timer, maar dat ben ik weer een Thread per connectie kwijt, en dat kost weer veel resources.
Ideëen
Een mogelijkheid die ik zelf bedacht had was 1 Thread waar alle connecties in een lijst komen te staan, gegroepeerd per minuut. Deze thread kijkt dan elke minuut welke connecties er moeten worden vernieuwd, en voert dit dan uit. Mijn grootste bezwaar hierbij, is dat met bijvoorbeeld 10000 connecties, er eens per minuut meer dan 300 commando's achter elkaar worden verstuurd. Erg onregelmatig dus.
Andere mogelijkheden zijn het Twisted framework. Als ik het goed begrepen heb is het een framework waarmee je een soort event-driven programma's kunt schrijven. Helaas is dit weer niet platform onafhankelijk. En ook wil ik juist zo'n min mogelijk code gebruiken voor de server. De IMAP client heb ik dan ook zelf geschreven in plaat van een module te gebruiken.
Een andere oplossing is het gebruik van microthreads. Dit kan m.b.v. Stackless Python. Maar dit is weer een complete Python interpreter, welke nog experimenteel is ook.
Het liefst doe ik het natuurlijk zoals signal.alarm, of zoals ObjC volgens mij kan. Max 1 thread die gewoon voor de timers zorgt, en de bijbehorende functies aanroept.