<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
</head>
<body>
<div name="messageBodySection">
<div dir="auto">Hi Sebastian,
<div dir="auto"><br /></div>
<div dir="auto">In the past, I co-developed this repo: <a href="https://github.com/inasafe/inasafe-headless">https://github.com/inasafe/inasafe-headless</a> and mainly involved with the testing architecture. It is a legacy code which we haven’t maintain for quite some time and haven’t been migrated to python 3/ QGIS 3. But I imagine the concept is similar.</div>
<div dir="auto"><br /></div>
<div dir="auto">I’m going to share you some information about the repo, so you can determine if the use case is similar. The repositories has the following characteristic:</div>
<div dir="auto"><br /></div>
<div dir="auto">
<ul>
<li><span style="color: var(--textColor); background-color: var(--backgroundColor);"></span>It tests a python application, that uses functions from a QGIS plugin (python code), that is running headlessly, on top of headless QGIS, on top of docker container</li>
<li>The code heavily uses horizontal scaling and threading via Python Celery module. But since mainly the purpose is to generate reports, it is best to run it as single threaded app and the scaling is done by horizontally increase the scale of worker containers (not Linux process inside a container)</li>
<li>There are two main part of the codes the master node and worker node. Worker node will always run in a different thread from master node. So the coverage.py scripts needs to be “injected” in the python’s “sitecustomize.py” file in it’s dist dir.</li>
<li>You can not generate one coverage report in this scenario, since part of the code runs in different contexts. Leverage coverage.py to gather multiple reports from different process, and aggregate the report.</li>
<li>Bug that happens usually caused by race condition due to the constraint that there should be one running UI thread and you need to properly switch the context. All the resources also needs to be carefully deallocated if you deal with UI (in my case, the QgsComposer functionality).</li>
</ul>
<div dir="auto"><br /></div>
<div dir="auto">I’ve managed to do this in QGIS 2, so it is not impossible :).</div>
<div dir="auto">If you have race condition, there are two possible cause:</div>
<div dir="auto">
<ol start="1" type="1" rd_type_protected="true">
<li><span style="color: var(--textColor); background-color: var(--backgroundColor);"></span>You didn’t respect the threading constraint (background tasks should not update UI tasks directly)</li>
<li>The functionality you use, simply doesn’t support multi threading or not designed to be multi threading</li>
</ol>
<div dir="auto">When I encounter case 2, my workaround is to not go against it, but rather horizontally scale in container contexts, instead of native threads. But this might not apply in your case. It depends on how you are planning to use multithreading in your app.</div>
<div dir="auto"><br /></div>
<div dir="auto">You can directly check how we test it by navigating into the .travis.yml file to see how the architecture is built and used.</div>
</div>
</div>
</div>
</div>
<div name="messageSignatureSection"><br />
<div>Regards,
<div>
<div>--</div>
<div>Rizky Maulana Nugraha</div>
<div>Senior Software Engineer</div>
<div>Kartoza</div>
<a href="mailto:rizky@kartoza.com">rizky@kartoza.com</a></div>
</div>
</div>
<div name="messageReplySection">On 14 Apr 2020 21.50 +0700, Sebastian M. Ernst <ernst@pleiszenburg.de>, wrote:<br />
<blockquote type="cite" class="spark_quote" style="margin: 5px 5px; padding-left: 10px; border-left: thin solid #1abc9c;">Hi all,<br />
<br />
has someone by any chance been trying or even successfully using<br />
`coverage.py` (1) inside QGIS' Python code and/or plugins and could<br />
share some experience?<br />
<br />
For me, it works, sometimes, with plenty of edge cases ... I am<br />
basically running into all sorts of wired issues - presumably due to<br />
threads and race conditions.<br />
<br />
Thanks,<br />
Sebastian<br />
<br />
<br />
1: https://coverage.readthedocs.io/<br />
_______________________________________________<br />
QGIS-Developer mailing list<br />
QGIS-Developer@lists.osgeo.org<br />
List info: https://lists.osgeo.org/mailman/listinfo/qgis-developer<br />
Unsubscribe: https://lists.osgeo.org/mailman/listinfo/qgis-developer</blockquote>
</div>
</body>
</html>