Hi I was playing with multiple mysql connection in separate processes with the multiprocessing module.
When I run the following code in linux all goes well. But when I try in win32 I get a pickle error saying it cant pickle None Type when I start the process. Python 2.6 on both platforms. Thanks in advance. from __future__ import print_function import sys import os import platform import MySQLdb import multiprocessing import time import cPickle as Pickle VERBOSE = False class SQL_Query(object): def __init__(self, SQL, callback): self.SQL = SQL self.callback = callback class Connection(multiprocessing.Process): def __init__(self,in_queue, out_queue): multiprocessing.Process.__init__(self) self.in_queue = in_queue self.out_queue = out_queue self.counter = 10 #int(self.conf["db_num_queries"]) # Number of queries to handle before closing down. self.all_ok = True self.con = self.get_connection() def escape(self, string): return MySQLdb.escape(string) def execute(self, sql): "Return results of sql from database, sql must be valid SQL as no checking is done." if VERBOSE: print (sql) res = True last_id = 0 self.counter -= 1 if self.con: try: cur = self.con.cursor() cur.execute("START TRANSACTION") cur.execute(sql) res = cur.fetchall() self.con.commit() last_id = cur.execute("SELECT LAST_INSERT_ID()") cur.close() except Exception as e : res = False # For tracking insert failure etc... self.all_ok = False self.con.rollback() self.out_queue.put((res, last_id)) else: util.error_ui(message = "A Connection has not been established with the database.") def get_connection(self): self.con = "" hst = "127.0.0.1" usr = "usr" pwd = "pass" database = "db" try: self.con = MySQLdb.connect(host=hst, user=usr, passwd=pwd, db=database) except Exception as e: pass return self.con def run(self): proc_name = self.name while self.counter > 0: next_sql = self.in_queue.get() print(self, self.counter, next_sql.SQL) if next_sql is None: # Stop Process return result = self.execute(next_sql.SQL) self.out_queue.put(result) self.close_down() self.out_queue.put(("RESTART", self.name)) return # # clean up # def close_down(self, arg1 = None): if self.con: self.con.close() if __name__ == "__main__": in_queue = multiprocessing.Queue() out_queue = multiprocessing.Queue() pool = [] pool.append(Connection(in_queue, out_queue)) pool.append(Connection(in_queue, out_queue)) pool.append(Connection(in_queue, out_queue)) print(pool) for c in pool: c.start() for i in range(100): print(i) s = SQL_Query("SELECT * FROM customer ", "-") #time.sleep(0.015) in_queue.put(s) while True: o = out_queue.get() if o: if o[0]=="RESTART": print(o) print(pool) for c in pool: if c.name == o[1]: print(c) c.join() c.terminate() pool.remove(c) nc = Connection(in_queue, out_queue) nc.start() pool.append(nc) -- -- Rob _______________________________________________ python-win32 mailing list python-win32@python.org http://mail.python.org/mailman/listinfo/python-win32