On 18/02/2011 2:54 AM, Terry Reedy wrote:
On 2/17/2011 6:31 PM, Matt Chaput wrote:
Does anyone know the "right" way to write a unit test for code that uses
multiprocessing on Windows?

I would start with Lib/test/test_multiprocessing.

Good idea, but on the one hand it doesn't seem to be doing anything special, and on the other hand it seems to do it's own things like not having its test cases inherit from unittest.TestCase. I also don't know if the Python devs start it with distutils or nosetests, which are the ones I'm having a problem with. For example, starting my test suite inside PyDev doesn't show the bug.

My test code isn't doing anything unusual... this is pretty much all I do to trigger the bug. (None of the imported code has anything to do with processes.)


from __future__ import with_statement
import unittest
import random

from whoosh import fields, query
from whoosh.support.testing import TempIndex

try:
    import multiprocessing
except ImportError:
    multiprocessing = None


if multiprocessing:
    class MPFCTask(multiprocessing.Process):
        def __init__(self, storage, indexname):
            multiprocessing.Process.__init__(self)
            self.storage = storage
            self.indexname = indexname

        def run(self):
            ix = self.storage.open_index(self.indexname)
            with ix.searcher() as s:
                r = s.search(query.Every(), sortedby="key", limit=None)
                result = "".join([h["key"] for h in r])
assert result == "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", result

class TestSorting(unittest.TestCase):
    def test_mp_fieldcache(self):
        if not multiprocessing:
            return

        schema = fields.Schema(key=fields.KEYWORD(stored=True))
        with TempIndex(schema, "mpfieldcache") as ix:
domain = list(u"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
            random.shuffle(domain)
            w = ix.writer()
            for char in domain:
                w.add_document(key=char)
            w.commit()

            tasks = [MPFCTask(ix.storage, ix.indexname) for _ in xrange(4)]
            for task in tasks:
                task.start()
            for task in tasks:
                task.join()


if __name__ == '__main__':
    unittest.main()


--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to