Thanks, that's good to know. I'll look into the scheduler.
On Saturday, January 10, 2015 at 7:54:39 PM UTC-6, Massimo Di Pierro wrote:
>
> You should not create threads from insider a web applications. Not in
> web2py. Not in any other web framework.
>
> This is because threads are managed by the web server which spawns a new
> one when an http request arrives and kills them they they are completed or
> timeout. This logic is outside of your control and will conflict with your
> threads. depending on the web server you use, it may actually use processes
> instead of threads and it may decide a kill a process with all its threads.
>
> This is why web2py has a scheduler.
>
> On Saturday, 10 January 2015 10:32:41 UTC-6, Michael Sounhein wrote:
>>
>> Currently I am new to programming and I thought Python and web2py would
>> be a good way to learn. But, I am in it over my head when it comes to this
>> problem. I'm getting an error when trying to access a db connection inside
>> a Thread which is contained inside a module. The most pertinent part of the
>> error is this. "if not self.connection: raise ValueError(a[0])" Here are
>> the related pieces of code which are causing the problem. I've tried
>> setting the value of db using a method inside coffee_server_threadR6. I
>> have tried every way I can think of to get db into the module.(including
>> current) and unfortunately once the tread is initialized I can't retrieve
>> or set any data from my database. The only thing that does work is seeing
>> which tables, and columns exist. So, it's as though once the variable db
>> gets placed into the thread it no longer has a connection to the database
>> at all. Any thoughts on this are appreciated.
>>
>> Models - db.py
>>
>> db = DAL('sqlite://storage.sqlite',pool_size=2,check_reserved=['all'],
>> do_connect=True)
>>
>> Controllers - default
>>
>> @auth.requires_login()
>> def startserv():
>> Server.ThreadedTCPRequestHandler.db = db
>> reactor = Server.Reactor()
>> reactor.daemon = True
>> reactor.start()
>> return redirect(URL('index'))
>>
>> Modules - coffee_server_threadR6.py
>>
>> #!/usr/bin/env python
>> # -*- coding: utf-8 -*-
>> from gluon import *
>> from gluon import current
>> import threading
>> import time
>> import SocketServer
>> import struct
>> import binascii
>> from subprocess import Popen
>> import databaseTest as Db_Conn
>>
>>
>> SEND_WAKEUP = chr(1)
>> AM_AWAKE = chr(0)
>>
>> class ThreadedTCPRequestHandler(SocketServer.StreamRequestHandler):
>>
>> cur_thread = threading.current_thread()
>> db = None
>>
>> def wakeup_computer(self,mac):
>> Popen(['echo', str(mac)])
>> time.sleep(3)
>> Popen(['echo', str(mac)])
>>
>> def handle(self):
>> recv_data = self.request.recv(1024)
>> packed_data = binascii.unhexlify(recv_data)
>> s = struct.Struct('c 17s')
>> self.unpacked_data = s.unpack(packed_data)
>> self.macAddr = str(self.unpacked_data[1])
>> self.command = self.unpacked_data[0]
>> response = "{}: {}".format(self.cur_thread.name, self.macAddr)
>> self.request.sendall(response)
>> self.updateDB(self.macAddr)
>>
>> def updateDB(self,mac):
>> print self.db.computerstats.fields
>> print self.db.computerstats.mac_addr.type
>> print type(mac)
>> comp = self.db(self.db.computerstats.id=="1").select().first()
>> print comp
>> self.db(self.db.computerstats.mac_addr==mac).update(status=1)
>> self.db.commit()
>>
>> #self.db(self.db.computerstats.mac_addr=='AA:BB:CC:DD:EE:FF').update(status=True)
>>
>> class ThreadedTCPServer(SocketServer.ThreadingTCPServer):
>> pass
>>
>>
>> class CountThread(threading.Thread):
>> def run(self):
>> global TOTAL
>> for i in range(100):
>> TOTAL = TOTAL + 1
>> print('%s\n' % (TOTAL))
>>
>> class Reactor(threading.Thread):
>>
>> def run(self):
>> self.HOST, self.PORT = '', 8585
>> SocketServer.TCPServer.allow_reuse_address = True
>> self.server = ThreadedTCPServer((self.HOST, self.PORT),
>> ThreadedTCPRequestHandler)
>> print "Server is set up"
>> self.server.serve_forever()
>>
>> coffee_client.py - Executed from another computer. Currently testing from
>> local machine.
>>
>> from socket import *
>> import struct
>> import binascii
>>
>>
>> SEND_WAKEUP = chr(1)
>> AM_AWAKE = chr(0)
>>
>> def send(data):
>> sock = socket(AF_INET,SOCK_STREAM)
>> sock.connect(('127.0.0.1',8585))
>> try:
>> sock.send(data)
>> response = sock.recv(1024)
>> print "Received: {}".format(response)
>> finally:
>> sock.close()
>>
>> def wakeup(mac):
>> values = (SEND_WAKEUP, mac)
>> s = struct.Struct('c 17s')
>> packed_data = s.pack(*values)
>> hex_packed_data = binascii.hexlify(packed_data)
>> send(hex_packed_data)
>>
>> def am_awake(mac):
>> values = (AM_AWAKE, mac)
>> s = struct.Struct('c 17s')
>> packed_data = s.pack(*values)
>> hex_packed_data = binascii.hexlify(packed_data)
>> send(hex_packed_data)
>>
>>
>> am_awake('AA:BB:CC:DD:EE:FF')
>>
>>
>>
>>
--
Resources:
- http://web2py.com
- http://web2py.com/book (Documentation)
- http://github.com/web2py/web2py (Source code)
- https://code.google.com/p/web2py/issues/list (Report Issues)
---
You received this message because you are subscribed to the Google Groups
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.