Skip to main content
# qt_multiprocessing

Long running process that runs along side of the Qt event loop and allows other widgets to live in the other process.

## Quick Start

```python
import os
import qt_multiprocessing

from qtpy import QtWidgets


class MyPIDLabel(QtWidgets.QLabel):
def print_pid(self):
text = self.text()
print(text, 'PID:', os.getpid())
return text


class MyPIDLabelProxy(qt_multiprocessing.WidgetProxy):
PROXY_CLASS = MyPIDLabel
GETTERS = ['text']


if __name__ == '__main__':
with qt_multiprocessing.MpApplication() as app:
print("Main PID:", os.getpid())

# Proxy
lbl = MyPIDLabelProxy("Hello")

widg = QtWidgets.QDialog()
lay = QtWidgets.QFormLayout()
widg.setLayout(lay)

# Form
inp = QtWidgets.QLineEdit()
btn = QtWidgets.QPushButton('Set Text')
lay.addRow(inp, btn)

def set_text():
text = inp.text()
lbl.setText(inp.text())

# Try to somewhat prove that the label is in a different process.
# `print_pid` Not exposed (will call in other process. Result will be None)
print('Set Label text', text + '. Label text in this process', lbl.print_pid())

# `print_pid` will run in a separate process and print the pid.

btn.clicked.connect(set_text)

widg.show()
```

Below is an example for if you want to manually create widgets in a different process without the proxy.

```python
import os
import qt_multiprocessing

from qtpy import QtWidgets


class MyPIDLabel(QtWidgets.QLabel):
def print_pid(self):
text = self.text()
print(text, 'PID:', os.getpid())
return text


def create_process_widgets():
lbl = MyPIDLabel('Hello')
lbl.show()
return {'label': lbl}


if __name__ == '__main__':
with qt_multiprocessing.MpApplication(initialize_process=create_process_widgets) as app:
print("Main PID:", os.getpid())

widg = QtWidgets.QDialog()
lay = QtWidgets.QFormLayout()
widg.setLayout(lay)

# Form
inp = QtWidgets.QLineEdit()
btn = QtWidgets.QPushButton('Set Text')
lay.addRow(inp, btn)

def set_text():
text = inp.text()
app.add_var_event('label', 'setText', text)

# The label does not exist in this process at all. Can only access by string names
print('Set Label text', text + '.')

# `print_pid` will run in a separate process and print the pid.
app.add_var_event('label', 'print_pid')

btn.clicked.connect(set_text)

widg.show()
```

## How it works

This library works by creating an event loop in a separate process while the Qt application is running in the main
process. This library is built off of the mp_event_loop library which creates a long running process where events are
thrown on a queue and executed in a separate process. The other process that is created also runs it's own Qt
application while executing events in a timer.

This library has the ability to:
* dynamic creation of widgets in a separate process
* Run methods of widgets in a separate process through variable names
* Proxy widgets


## Manual Example

This example shows how everything comes together manually

```python
import os
import qt_multiprocessing

from qtpy import QtWidgets


class MyPIDLabel(QtWidgets.QLabel):
def print_pid(self):
text = self.text()
print(text, 'PID:', os.getpid())
return text


def create_process_widgets():
lbl = MyPIDLabel('Hello')
lbl.show()
return {'label': lbl}


if __name__ == '__main__':
app = QtWidgets.QApplication([])
mp_loop = qt_multiprocessing.AppEventLoop(initialize_process=create_process_widgets)
print("Main PID:", os.getpid())

widg = QtWidgets.QDialog()
lay = QtWidgets.QFormLayout()
widg.setLayout(lay)

# Form
inp = QtWidgets.QLineEdit()
btn = QtWidgets.QPushButton('Set Text')
lay.addRow(inp, btn)

def set_text():
text = inp.text()
mp_loop.add_var_event('label', 'setText', text)

# The label does not exist in this process at all. Can only access by string names
print('Set Label text', text + '.')

# `print_pid` will run in a separate process and print the pid.
mp_loop.add_var_event('label', 'print_pid')

btn.clicked.connect(set_text)

widg.show()

# Run the multiprocessing event loop
mp_loop.start()

# Run the application event loop
app.exec_()

# Quit the multiprocessing event loop when the app closes
mp_loop.close()
```

Metadata

Release files for qt-multiprocessing 0.0.8

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for qt-multiprocessing 0.0.8
File Size Uploaded
qt_multiprocessing-0.0.8.tar.gz 6.7 kB Details

Release files / qt_multiprocessing-0.0.8.tar.gz

Download URL qt_multiprocessing-0.0.8.tar.gz
Size 6.7 kB
Tags Source
SHA-256 checksum
How to use checksums
097e63f24182a31b7ab8e329558f4f27d68caf7f2b5e07a2447bd5a7eb7d6a23
BLAKE2b-256 checksum
How to use checksums
82e09ae181b8f6255afbd5a086fc8661687ecebcbf08fccbebf92601ee18f322
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/1.11.0 pkginfo/1.4.2 requests/2.19.1 setuptools/39.1.0 requests-toolbelt/0.8.0 tqdm/4.23.4 CPython/3.6.2

Release history Release notifications | RSS feed

This release

0.0.8 This release

1 release file

0.0.7

1 release file

0.0.6

1 release file

0.0.5

1 release file

0.0.4

1 release file

0.0.3

1 release file

0.0.2

1 release file

0.0.1

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page