Hi everyone,
I am writing to share my attempt of "Using threads to do re-occuring
jobs", and seek your advice.
Basically, I hope to insert some records into a table automatically
every few minutes. This looks same as Voltron did in his post "Re-
occuring jobs".
http://groups.google.com/group/web2py/browse_thread/thread/1af0256b2beeec62
Also, I noticed Achipa's excellent advice about what shall be careful.
http://groups.google.com/group/web2py/msg/e39821790e4b1973
as well as the discussion in this post "Multiple Threading":
http://groups.google.com/group/web2py/browse_thread/thread/6252b1e9a777ee0a#
Since I plan to use a single web2py (no multi WSGI process), and the
inserting record job should not take long time, so I decide to try
threading anyway.
I came out with this code snippet, attached at the end of this post.
It is still very rough, but it seems my idea works. The re-occuring
job will be triggered by separate thread, can access same SQLite db
(via main thread, I believe), and other normal requests can be served
during the time.
I am writing to seek advice. At least I remember Massimo mentioned
"You should not create threads manually by using thread and threading
modules" in his post:
http://groups.google.com/group/web2py/msg/9bf44919adfdbf45
So, did I miss something important? Say, will this trick cause
infinite threads to be created then eventually halt the main web2py
process?
My model.py:
db=SQLDB('sqlite://storage.db')
db.define_table('activity',SQLField('whatever','text'))
All in my controller.py:
def __stamp(): # do the real job
import datetime, logging
logging.warn('stamp() is called at %s' % datetime.datetime.now())
rows=db(db.activity.id==1).select(db.activity.ALL) # I can access
SQLite DB in "multithread" world
def secretEntrance(): # should be protected by only allowing access
from localhost
return __stamp()
def __trigger(): # Here comes the magic
import urllib,threading
urllib.urlopen('http://%s%s' % (
request.env.http_host,
URL(r=request,f='secretEntrance'))
).read() # Use this trick to avoid accessing DB by multi
thread ;-)
threading.Timer(5,__trigger).start() # infinite loop
def kickoff(): # This is the main entrance. You still need a initial
nudge to trigger all the magic
__trigger()
return 'started'
def usual_action(): # Just to show that normal requests are served as
usual
return {'foo':'bar'}
Sincerely,
Iceberg, 2009-Jan-04, 20:54(PM), Sun
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"web2py Web Framework" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/web2py?hl=en
-~----------~----~----~----~------~----~------~--~---