[python-win32] multiprocessing pickle problem in win32

Rob Brown-Bayliss r.brown.bayliss at gmail.com
Tue Nov 3 08:24:06 CET 2009


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


More information about the python-win32 mailing list