gmTools.py: send_mail() test

[email protected] Thu, 23 Mar 2017 13:12:16 +0100
Newsgroups gmane.comp.gnu.medical.devel
Message-ID <[email protected]>
To:[email protected]
From:[email protected]
Subject:=20gmTools=20test=20suite=20mail

This=20is=20a=20test=20mail=20from=20the=20gmTools.py=20module.

_______________________________________________
Gnumed-devel mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/gnumed-devel
gmWorkerThread.py (text/x-python, 3.1 KB)
from __future__ import print_function

__doc__ = """GNUmed worker threads."""
#=====================================================================
__author__ = "K.Hilbert <[email protected]>"
__license__ = "GPL v2 or later"

import sys
import logging
import threading
import datetime as dt

# wx.CallAfter() does not seem to work with multiprocessing !
#import multiprocessing


if __name__ == '__main__':
	sys.path.insert(0, '../../')


_log = logging.getLogger('gm.worker')

#=====================================================================
def execute_in_worker_thread(payload_function=None, payload_kwargs=None, completion_callback=None):
	"""Create a thread and have it execute <payload_function>.

	<completion_callback> - if not None - better be prepared to
	receive the result of <payload_function>.
	"""
	worker = None

	#-------------------------------
	def _run_payload():
		try:
			if payload_kwargs is None:
				payload_result = payload_function()
			else:
				payload_result = payload_function(**payload_kwargs)
		except StandardError:
			_log.exception('error running worker payload: %s', payload_function)
			return
		_log.debug(u'finished running worker payload')
		if completion_callback is None:
			return
		try:
			completion_callback(payload_result)
		except StandardError:
			_log.exception('error running worker completion callback: %s', completion_callback)
		_log.debug(u'finished running worker completion callback')
		return
	#-------------------------------

	if not callable(payload_function):
		raise ValueError(u'<%s> is not callable', payload_function)
	if completion_callback is not None:
		if not callable(completion_callback):
			raise ValueError(u'<%s> is not callable', completion_callback)
	thread_name = dt.datetime.now().strftime('%f-%H:%M:%S-%Y%m%d')
	_log.info(u'creating thread "%s"', thread_name)
	_log.debug(u' "%s" payload function: %s', thread_name, payload_function)
	_log.debug(u' "%s" results callback: %s', thread_name, completion_callback)

	#worker = multiprocessing.Process (
	worker = threading.Thread (
		target = _run_payload,
		name = thread_name
	)
	worker.start()
	_log.debug(' "%s" PID: %s', worker.name, worker.ident)
	# from here on, another thread executes _run_payload()
	# which executes payload_function(), and possibly
	# completion_callback()

#=====================================================================
# main
#=====================================================================
if __name__ == "__main__":

	if len(sys.argv) < 2:
		sys.exit()

	if sys.argv[1] != 'test':
		sys.exit()

	import time
	import random

	from Gnumed.pycommon import gmLog2

	def test_print_dots(ident=None):

		def slowly_print_dots(info=None):
			for i in range(5):
				print('* (#%s in %s)' % (i, info))
				time.sleep(1 + (random.random()*4))
			return '%s' % time.localtime()

		def print_dot_end_time(time_str):
			print('done: %s' % time_str)

		execute_in_worker_thread (
			payload_function = slowly_print_dots,
			payload_kwargs = {'info': ident},
			completion_callback = print_dot_end_time
		)

	test_print_dots('A')
	test_print_dots('B')