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 web2py+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.