<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://performiq.com/kb/index.php?action=history&amp;feed=atom&amp;title=Spawn.py</id>
	<title>Spawn.py - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://performiq.com/kb/index.php?action=history&amp;feed=atom&amp;title=Spawn.py"/>
	<link rel="alternate" type="text/html" href="https://performiq.com/kb/index.php?title=Spawn.py&amp;action=history"/>
	<updated>2026-05-20T00:34:20Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.37.1</generator>
	<entry>
		<id>https://performiq.com/kb/index.php?title=Spawn.py&amp;diff=3993&amp;oldid=prev</id>
		<title>PeterHarding: /* Overview */</title>
		<link rel="alternate" type="text/html" href="https://performiq.com/kb/index.php?title=Spawn.py&amp;diff=3993&amp;oldid=prev"/>
		<updated>2013-03-12T22:19:28Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Overview&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 08:19, 13 March 2013&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l6&quot;&gt;Line 6:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 6:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;#! /usr/bin/env python&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;#! /usr/bin/env python&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;#&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;#&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;#    $Id:$&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;#&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;#&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;#  Purpose:  Spawn multiple test scripts in a controlled way with logging&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;#  Purpose:  Spawn multiple test scripts in a controlled way with logging&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>PeterHarding</name></author>
	</entry>
	<entry>
		<id>https://performiq.com/kb/index.php?title=Spawn.py&amp;diff=2081&amp;oldid=prev</id>
		<title>PeterHarding at 07:42, 2 May 2008</title>
		<link rel="alternate" type="text/html" href="https://performiq.com/kb/index.php?title=Spawn.py&amp;diff=2081&amp;oldid=prev"/>
		<updated>2008-05-02T07:42:28Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 17:42, 2 May 2008&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;Line 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=Overview=&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=Overview=&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;This script is specifically targetted to run test.py which takes a single mandatory argument - the connector ID of the ODBC connection to use.  So the script uses a list of connector numbers as run tokens.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;This script is specifically targetted to run &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;b&amp;gt;&lt;/ins&gt;test.py&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;/b&amp;gt; &lt;/ins&gt;which takes a single mandatory argument - the connector ID of the ODBC connection to use.  So the script uses a list of connector numbers as run tokens.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>PeterHarding</name></author>
	</entry>
	<entry>
		<id>https://performiq.com/kb/index.php?title=Spawn.py&amp;diff=2050&amp;oldid=prev</id>
		<title>PeterHarding at 06:35, 2 May 2008</title>
		<link rel="alternate" type="text/html" href="https://performiq.com/kb/index.php?title=Spawn.py&amp;diff=2050&amp;oldid=prev"/>
		<updated>2008-05-02T06:35:58Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;https://performiq.com/kb/index.php?title=Spawn.py&amp;amp;diff=2050&amp;amp;oldid=2043&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>PeterHarding</name></author>
	</entry>
	<entry>
		<id>https://performiq.com/kb/index.php?title=Spawn.py&amp;diff=2043&amp;oldid=prev</id>
		<title>PeterHarding at 05:28, 2 May 2008</title>
		<link rel="alternate" type="text/html" href="https://performiq.com/kb/index.php?title=Spawn.py&amp;diff=2043&amp;oldid=prev"/>
		<updated>2008-05-02T05:28:29Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 15:28, 2 May 2008&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l446&quot;&gt;Line 446:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 446:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Category:Python]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Category:Python]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Category:Testing]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Category:Testing]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[Category:ODBC]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>PeterHarding</name></author>
	</entry>
	<entry>
		<id>https://performiq.com/kb/index.php?title=Spawn.py&amp;diff=2042&amp;oldid=prev</id>
		<title>PeterHarding: New page: =Overview=  This script is specifically targetted to run test.py which takes a single mandatory argument - the connector ID of the ODBC connection to use.  So the script uses a list of con...</title>
		<link rel="alternate" type="text/html" href="https://performiq.com/kb/index.php?title=Spawn.py&amp;diff=2042&amp;oldid=prev"/>
		<updated>2008-05-02T05:28:12Z</updated>

		<summary type="html">&lt;p&gt;New page: =Overview=  This script is specifically targetted to run test.py which takes a single mandatory argument - the connector ID of the ODBC connection to use.  So the script uses a list of con...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;=Overview=&lt;br /&gt;
&lt;br /&gt;
This script is specifically targetted to run test.py which takes a single mandatory argument - the connector ID of the ODBC connection to use.  So the script uses a list of connector numbers as run tokens.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#! /usr/bin/env python&lt;br /&gt;
#&lt;br /&gt;
#    $Id:$&lt;br /&gt;
#&lt;br /&gt;
#  Purpose:  Spawn multiple test scripts in a controlled way with logging&lt;br /&gt;
#&lt;br /&gt;
#-------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
import sys&lt;br /&gt;
import re&lt;br /&gt;
import os&lt;br /&gt;
import time&lt;br /&gt;
import getopt&lt;br /&gt;
import string&lt;br /&gt;
import logging&lt;br /&gt;
import datetime&lt;br /&gt;
&lt;br /&gt;
#-------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
__version__        = &amp;#039;1.2.0&amp;#039;&lt;br /&gt;
&lt;br /&gt;
debug_level        = 0&lt;br /&gt;
verbose_flg        = False&lt;br /&gt;
&lt;br /&gt;
log                = None&lt;br /&gt;
&lt;br /&gt;
stagger_delay      = 3&lt;br /&gt;
duration           = None&lt;br /&gt;
no_connectors      = 3&lt;br /&gt;
connectors         = []&lt;br /&gt;
procs              = {}&lt;br /&gt;
&lt;br /&gt;
#===============================================================================&lt;br /&gt;
&lt;br /&gt;
def INFO(msg):&lt;br /&gt;
   if log: log.info(&amp;#039; &amp;#039; + msg)&lt;br /&gt;
   if verbose_flg: print &amp;quot;[test]  %s&amp;quot; % msg&lt;br /&gt;
&lt;br /&gt;
#-------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
def ERROR(msg):&lt;br /&gt;
   if log: log.error(msg)&lt;br /&gt;
   sys.stderr.write(&amp;#039;[test]  %s\n&amp;#039; % msg)&lt;br /&gt;
&lt;br /&gt;
#-------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
def WARNING(msg):&lt;br /&gt;
   if log: log.warning(&amp;#039;*****&amp;#039; + msg + &amp;#039;*****&amp;#039;)&lt;br /&gt;
   if verbose_flg: print &amp;quot;[test]  %s&amp;quot; % msg&lt;br /&gt;
&lt;br /&gt;
#===============================================================================&lt;br /&gt;
&lt;br /&gt;
def init():&lt;br /&gt;
   global log&lt;br /&gt;
&lt;br /&gt;
   pid      = os.getpid()&lt;br /&gt;
&lt;br /&gt;
   if debug_level &amp;gt; 0:  print &amp;quot;My PID is %d&amp;quot; % pid&lt;br /&gt;
&lt;br /&gt;
   log  = logging.getLogger(&amp;#039;spawn&amp;#039;)&lt;br /&gt;
   hdlr = logging.FileHandler(&amp;#039;log/spawn.log&amp;#039;)&lt;br /&gt;
   fmtr = logging.Formatter(&amp;#039;%(asctime)s %(levelname)s %(message)s&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
   hdlr.setFormatter(fmtr)&lt;br /&gt;
   log.addHandler(hdlr) &lt;br /&gt;
   log.setLevel(logging.INFO)&lt;br /&gt;
&lt;br /&gt;
   INFO(&amp;quot;===== Started processing ==================================&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
#-------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
def do_child(connector, delay):&lt;br /&gt;
   time.sleep(delay)&lt;br /&gt;
   os.execv(&amp;quot;./test.py&amp;quot;, [&amp;quot;./test.py&amp;quot;, &amp;quot;-c&amp;quot;, &amp;quot;%d&amp;quot; % connector])&lt;br /&gt;
&lt;br /&gt;
#-------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
def spawn():&lt;br /&gt;
   global stagger_delay&lt;br /&gt;
&lt;br /&gt;
   loop = True&lt;br /&gt;
&lt;br /&gt;
   delay = 0&lt;br /&gt;
&lt;br /&gt;
   t_start = datetime.datetime.now()&lt;br /&gt;
&lt;br /&gt;
   while loop:&lt;br /&gt;
      if len(connectors) &amp;gt; 0:&lt;br /&gt;
         connector = connectors.pop(0)&lt;br /&gt;
&lt;br /&gt;
         child_pid = os.fork()&lt;br /&gt;
&lt;br /&gt;
         if child_pid == 0:&lt;br /&gt;
            do_child(connector, delay)&lt;br /&gt;
         else:&lt;br /&gt;
            INFO(&amp;quot;Spawned test process (PID %d) on connector %d&amp;quot; % (child_pid, connector))&lt;br /&gt;
            procs[child_pid] = connector&lt;br /&gt;
&lt;br /&gt;
         delay += stagger_delay&lt;br /&gt;
      else:&lt;br /&gt;
         stagger_delay = 0&lt;br /&gt;
&lt;br /&gt;
         (pid, status) = os.wait()&lt;br /&gt;
&lt;br /&gt;
         connector     = procs[pid]&lt;br /&gt;
&lt;br /&gt;
         INFO(&amp;quot;cleaned up child process (PID %d) with connector %d&amp;quot; % (pid, connector))&lt;br /&gt;
&lt;br /&gt;
         del procs[pid]&lt;br /&gt;
&lt;br /&gt;
         t_now   = datetime.datetime.now()&lt;br /&gt;
&lt;br /&gt;
         t_delta = t_now - t_start&lt;br /&gt;
&lt;br /&gt;
         if duration:&lt;br /&gt;
            if t_delta &amp;lt; duration:&lt;br /&gt;
               connectors.append(connector)&lt;br /&gt;
               continue&lt;br /&gt;
&lt;br /&gt;
         if len(procs) == 0:&lt;br /&gt;
            loop = False&lt;br /&gt;
&lt;br /&gt;
   INFO(&amp;quot;***** FINISHED *****&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
#-------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
def usage():&lt;br /&gt;
   USAGE = &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
     Usage:&lt;br /&gt;
     &lt;br /&gt;
       $ spawn.py -n &amp;lt;no_to_spawn&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
   sys.stderr.write(USAGE)&lt;br /&gt;
   &lt;br /&gt;
#-------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
def main(argv):&lt;br /&gt;
   global debug_flg, verbose_flg, no_connectors, duration, stagger_delay&lt;br /&gt;
&lt;br /&gt;
   #----- Process command line arguments ----------------------------&lt;br /&gt;
&lt;br /&gt;
   duration_min = None&lt;br /&gt;
&lt;br /&gt;
   try:&lt;br /&gt;
      opts, args = getopt.getopt(argv, &amp;quot;dD:hn:s:vV&amp;quot;,&lt;br /&gt;
              [&amp;quot;debug&amp;quot;, &amp;quot;duration=&amp;quot;, &amp;quot;help&amp;quot;, &amp;quot;no=&amp;quot;, &amp;quot;stagger=&amp;quot;, &amp;quot;verbose&amp;quot;, &amp;quot;version&amp;quot;])&lt;br /&gt;
   except getopt.GetoptError:&lt;br /&gt;
      usage()&lt;br /&gt;
      sys.exit(2)&lt;br /&gt;
   else:&lt;br /&gt;
      for opt, arg in opts:&lt;br /&gt;
         if opt in (&amp;quot;-h&amp;quot;, &amp;quot;--help&amp;quot;):&lt;br /&gt;
            usage()&lt;br /&gt;
            sys.exit(0)&lt;br /&gt;
         elif opt == &amp;quot;-d&amp;quot;:&lt;br /&gt;
            debug_level                += 1&lt;br /&gt;
         elif opt == &amp;quot;--debug&amp;quot;:&lt;br /&gt;
            debug_level                 = int(arg)&lt;br /&gt;
         elif opt in (&amp;quot;-D&amp;quot;, &amp;quot;--duration&amp;quot;):&lt;br /&gt;
            duration_min                = int(arg)&lt;br /&gt;
         elif opt in (&amp;quot;-s&amp;quot;, &amp;quot;--stagger&amp;quot;):&lt;br /&gt;
            stagger_delay               = int(arg)&lt;br /&gt;
         elif opt in (&amp;quot;-n&amp;quot;, &amp;quot;--no&amp;quot;):&lt;br /&gt;
            no_connectors               = int(arg)&lt;br /&gt;
            if no_connectors &amp;gt; 10:&lt;br /&gt;
               no_connectors = 10&lt;br /&gt;
               sys.stderr.write(&amp;quot;Only 10 ODBC connectors available!&amp;quot;)&lt;br /&gt;
               sys.stderr.flush()&lt;br /&gt;
         elif opt in (&amp;quot;-v&amp;quot;, &amp;quot;--verbose&amp;quot;):&lt;br /&gt;
            verbose_flg = True&lt;br /&gt;
         elif opt in (&amp;quot;-V&amp;quot;, &amp;quot;--version&amp;quot;):&lt;br /&gt;
            print &amp;quot;Version: %s&amp;quot; % __version__&lt;br /&gt;
            sys.exit(0)&lt;br /&gt;
&lt;br /&gt;
   if duration_min:&lt;br /&gt;
      print &amp;quot;[spawn]  Running for a duration of %d minutes&amp;quot; % duration_min&lt;br /&gt;
      duration = datetime.timedelta(minutes=duration_min)&lt;br /&gt;
&lt;br /&gt;
   for i in range(no_connectors):&lt;br /&gt;
      connectors.append(i + 1)&lt;br /&gt;
&lt;br /&gt;
   print &amp;quot;[spawn]  Using these ODBC connectors - %s&amp;quot; % connectors&lt;br /&gt;
&lt;br /&gt;
   init()&lt;br /&gt;
&lt;br /&gt;
   spawn()&lt;br /&gt;
&lt;br /&gt;
#---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
   main(sys.argv[1:])&lt;br /&gt;
&lt;br /&gt;
#---------------------------------------------------------------------&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=test.py=&lt;br /&gt;
&lt;br /&gt;
Note, with this script I am running the ActiveState Python binary so as to make use of its ODBC functionality!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/c/PROGRA~1/ActiveState/Python/python.exe&lt;br /&gt;
#&lt;br /&gt;
#-------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
import os&lt;br /&gt;
import sys&lt;br /&gt;
import dbi&lt;br /&gt;
import odbc&lt;br /&gt;
import time&lt;br /&gt;
import getopt&lt;br /&gt;
import logging&lt;br /&gt;
&lt;br /&gt;
from datetime import datetime&lt;br /&gt;
&lt;br /&gt;
#-------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
from RTE import dcl&lt;br /&gt;
&lt;br /&gt;
#-------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
__version__   = &amp;quot;1.0.0&amp;quot;&lt;br /&gt;
__id__        = &amp;quot;@(#)  skel.py  [%s]  05/03/2008&amp;quot;&lt;br /&gt;
&lt;br /&gt;
verbose_flg   = False&lt;br /&gt;
&lt;br /&gt;
debug_level   = 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
table_name    = &amp;quot;Manifests&amp;quot;&lt;br /&gt;
PORT          = 9579&lt;br /&gt;
MAX_REQUESTS  = 10&lt;br /&gt;
&lt;br /&gt;
log           = None&lt;br /&gt;
handle        = &amp;#039;ODBC_%02d&amp;#039;&lt;br /&gt;
connector_no  = 1&lt;br /&gt;
&lt;br /&gt;
#===============================================================================&lt;br /&gt;
&lt;br /&gt;
def INFO(msg):&lt;br /&gt;
   if log: log.info(&amp;#039; &amp;#039; + msg)&lt;br /&gt;
   if verbose_flg: print &amp;quot;[test]  %s&amp;quot; % msg&lt;br /&gt;
&lt;br /&gt;
#-------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
def ERROR(msg):&lt;br /&gt;
   if log: log.error(msg)&lt;br /&gt;
   sys.stderr.write(&amp;#039;[test]  %s\n&amp;#039; % msg)&lt;br /&gt;
&lt;br /&gt;
#-------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
def WARNING(msg):&lt;br /&gt;
   if log: log.warning(&amp;#039;*****&amp;#039; + msg + &amp;#039;*****&amp;#039;)&lt;br /&gt;
   if verbose_flg: print &amp;quot;[test]  %s&amp;quot; % msg&lt;br /&gt;
&lt;br /&gt;
#===============================================================================&lt;br /&gt;
&lt;br /&gt;
def the_time():&lt;br /&gt;
   t = float(ref_time(False)) * 0.001&lt;br /&gt;
&lt;br /&gt;
   return t&lt;br /&gt;
&lt;br /&gt;
#------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
t_reference = None&lt;br /&gt;
&lt;br /&gt;
def ref_time(flg):&lt;br /&gt;
   global t_reference&lt;br /&gt;
&lt;br /&gt;
   t_now  = datetime.now()&lt;br /&gt;
&lt;br /&gt;
   if (flg):&lt;br /&gt;
      t_reference   = t_now&lt;br /&gt;
      t             = 0&lt;br /&gt;
   else:&lt;br /&gt;
      t_delta       = t_now - t_reference&lt;br /&gt;
      t             = ((t_delta.seconds * 1000000) + t_delta.microseconds)/1000.0&lt;br /&gt;
&lt;br /&gt;
   return t&lt;br /&gt;
&lt;br /&gt;
#===============================================================================&lt;br /&gt;
&lt;br /&gt;
def query(no_queries, connector_no):&lt;br /&gt;
   ds = dcl.dcl(port=PORT)&lt;br /&gt;
&lt;br /&gt;
   if (ds == None):&lt;br /&gt;
      print(&amp;quot;Connection to data server failed - is data server process running?\n&amp;quot;)&lt;br /&gt;
      return 1&lt;br /&gt;
&lt;br /&gt;
   type_ref  = ds.RegisterType(table_name)&lt;br /&gt;
&lt;br /&gt;
   if debug_level &amp;gt; 0:print &amp;quot;Data type \&amp;quot;%s\&amp;quot; registered as %d&amp;quot; % (table_name,  type_ref)&lt;br /&gt;
&lt;br /&gt;
   s = odbc.odbc(handle % connector_no)&lt;br /&gt;
&lt;br /&gt;
   cur = s.cursor()&lt;br /&gt;
&lt;br /&gt;
   cnt = 0&lt;br /&gt;
&lt;br /&gt;
   while cnt &amp;lt; no_queries:&lt;br /&gt;
      cnt += 1&lt;br /&gt;
&lt;br /&gt;
      sp  = ds.GetNext(type_ref)&lt;br /&gt;
&lt;br /&gt;
      if sp != None:&lt;br /&gt;
         manifest = sp[0]&lt;br /&gt;
      else:&lt;br /&gt;
         print &amp;quot;Type %d exhausted&amp;quot; % (pid, type_ref)&lt;br /&gt;
         return&lt;br /&gt;
&lt;br /&gt;
      # print manifest&lt;br /&gt;
&lt;br /&gt;
      qry   = &amp;quot;exec dbp_get_Article_history_for_internet %s&amp;quot; % manifest&lt;br /&gt;
&lt;br /&gt;
      # print qry&lt;br /&gt;
&lt;br /&gt;
      ref_time(True)&lt;br /&gt;
&lt;br /&gt;
      cur.execute(qry)&lt;br /&gt;
&lt;br /&gt;
      t_query = the_time()&lt;br /&gt;
&lt;br /&gt;
      # print cur.description&lt;br /&gt;
&lt;br /&gt;
      # for tup in cur.description:&lt;br /&gt;
         # print tup[0]&lt;br /&gt;
&lt;br /&gt;
      row_cnt = 0&lt;br /&gt;
&lt;br /&gt;
      while 1:&lt;br /&gt;
         rec = cur.fetchmany(10)&lt;br /&gt;
         row_cnt +=  len(rec)&lt;br /&gt;
         if not rec: break&lt;br /&gt;
         #print rec&lt;br /&gt;
&lt;br /&gt;
      msg = &amp;quot;%02d ManifestNo %s  [%.3f] sec  %3d rows returned&amp;quot; % (cnt, manifest, t_query, row_cnt)&lt;br /&gt;
&lt;br /&gt;
      sys.stderr.write(&amp;quot;%s\n&amp;quot; % msg)&lt;br /&gt;
      sys.stderr.flush()&lt;br /&gt;
&lt;br /&gt;
      INFO(msg)&lt;br /&gt;
&lt;br /&gt;
#-------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
def init():&lt;br /&gt;
   global lf&lt;br /&gt;
   global log&lt;br /&gt;
&lt;br /&gt;
   pid      = os.getpid()&lt;br /&gt;
&lt;br /&gt;
   if debug_level &amp;gt; 0:  print &amp;quot;My PID is %d&amp;quot; % pid&lt;br /&gt;
&lt;br /&gt;
   log  = logging.getLogger(&amp;#039;test&amp;#039;)&lt;br /&gt;
   hdlr = logging.FileHandler(&amp;#039;log/hcodevj86_%02d.log&amp;#039; % connector_no)&lt;br /&gt;
   fmtr = logging.Formatter(&amp;#039;%(asctime)s %(levelname)s %(message)s&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
   hdlr.setFormatter(fmtr)&lt;br /&gt;
   log.addHandler(hdlr) &lt;br /&gt;
   log.setLevel(logging.INFO)&lt;br /&gt;
&lt;br /&gt;
   INFO(&amp;quot;===== Started processing ==================================&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
#===============================================================================&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
   global verbose_flg&lt;br /&gt;
   global debug_level&lt;br /&gt;
   global connector_no&lt;br /&gt;
   global MAX_REQUESTS&lt;br /&gt;
&lt;br /&gt;
   try:&lt;br /&gt;
      opts, args = getopt.getopt(sys.argv[1:], &amp;quot;c:dD:M:vVw?&amp;quot;)&lt;br /&gt;
   except getopt.error, msg:&lt;br /&gt;
      print __doc__&lt;br /&gt;
      return 1&lt;br /&gt;
&lt;br /&gt;
   for o, a in opts:&lt;br /&gt;
      if o == &amp;#039;-?&amp;#039;:&lt;br /&gt;
         print __doc__&lt;br /&gt;
         return 1&lt;br /&gt;
      elif o == &amp;#039;-c&amp;#039;:&lt;br /&gt;
         connector_no   = int(a)&lt;br /&gt;
      elif o == &amp;#039;-d&amp;#039;:&lt;br /&gt;
         debug_level   += 1&lt;br /&gt;
      elif o == &amp;#039;-D&amp;#039;:&lt;br /&gt;
         debug_level    = int(a)&lt;br /&gt;
      elif o == &amp;#039;-M&amp;#039;:&lt;br /&gt;
         MAX_REQUESTS   = int(a)&lt;br /&gt;
      elif o == &amp;#039;-v&amp;#039;:&lt;br /&gt;
         verbose_flg    = True&lt;br /&gt;
      elif o == &amp;#039;-V&amp;#039;:&lt;br /&gt;
         print &amp;quot;[xxxx]  Version: %s&amp;quot; % __version__&lt;br /&gt;
         return 1&lt;br /&gt;
      else:&lt;br /&gt;
         print __doc__&lt;br /&gt;
         return 1&lt;br /&gt;
&lt;br /&gt;
   sys.stderr.write(&amp;quot;[test]  Working directory is %s - Using ODBC connector %d\n&amp;quot; % (os.getcwd(), connector_no))&lt;br /&gt;
   sys.stderr.flush()&lt;br /&gt;
&lt;br /&gt;
   if (debug_level &amp;gt; 0): print &amp;quot;Debugging level set to %d&amp;quot; % debug_level&lt;br /&gt;
&lt;br /&gt;
   if args:&lt;br /&gt;
      for arg in args:&lt;br /&gt;
         print arg&lt;br /&gt;
&lt;br /&gt;
   init()&lt;br /&gt;
&lt;br /&gt;
   query(MAX_REQUESTS, connector_no)&lt;br /&gt;
&lt;br /&gt;
   return 0&lt;br /&gt;
&lt;br /&gt;
#-------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;#039;__main__&amp;#039; or __name__ == sys.argv[0]:&lt;br /&gt;
   try:&lt;br /&gt;
      sys.exit(main())&lt;br /&gt;
   except KeyboardInterrupt, e:&lt;br /&gt;
      print &amp;quot;[test]  Interrupted!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#-------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
Revision History:&lt;br /&gt;
&lt;br /&gt;
     Date     Who   Description&lt;br /&gt;
   --------   ---   ------------------------------------------------------------&lt;br /&gt;
   20080428   plh   Initial implementation&lt;br /&gt;
&lt;br /&gt;
Problems to fix:&lt;br /&gt;
&lt;br /&gt;
To Do:&lt;br /&gt;
&lt;br /&gt;
Issues:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Python]]&lt;br /&gt;
[[Category:Testing]]&lt;/div&gt;</summary>
		<author><name>PeterHarding</name></author>
	</entry>
</feed>