'deserialization error when calling method in python rq distributed queue

I am trying to test how to pass a python object to a rq worker process. I have the following classes in common.py

class Input:
    def __init__(self, arr_list: List):
        self.arr_list = arr_list

    def compute_sum(self):
        sum = 0
        for num in self.arr_list:
            sum += num
        time.sleep(10)
        return Output(sum)


class Output:
    def __init__(self, sum_result):
        self.sum_result = sum_result

    def __str__(self):
        return str(self.sum_result)


def calculate_sum(input_obj: Input) -> Output:
    return input_obj.compute_sum()

I am calling this method calculate_sum to calculate sum of 100 elements using rq.

from common import Input, calculate_sum


class TestRqJobSharding:

    def test_job_submission(self):
        index = 0
        batch = 10
        list_obj = [1] * 100
        jobs = []
        results = []
        while index < len(list_obj):
            new_batch = list_obj[index: index + batch]
            input_obj = Input(new_batch)
            job = get_queue().enqueue(calculate_sum, args=(input_obj,))
            index = index + batch
            jobs.append(job)
        results = submit_and_wait_till_completed(jobs)
        for result in results:
            print(f'{result}')
        print(results)

I am seeing the following deserialization error in worker process.

Traceback (most recent call last):
  File "/home/sshil/venv3.7/lib/python3.7/site-packages/rq/worker.py", line 1056, in perform_job
    self.prepare_job_execution(job)
  File "/home/sshil/venv3.7/lib/python3.7/site-packages/rq/worker.py", line 937, in prepare_job_execution
    self.procline(msg.format(job.func_name, job.origin, time.time()))
  File "/home/sshil/venv3.7/lib/python3.7/site-packages/rq/job.py", line 297, in func_name
    self._deserialize_data()
  File "/home/sshil/venv3.7/lib/python3.7/site-packages/rq/job.py", line 265, in _deserialize_data
    raise DeserializationError() from e
rq.exceptions.DeserializationError
Traceback (most recent call last):
  File "/home/sshil/venv3.7/lib/python3.7/site-packages/rq/job.py", line 262, in _deserialize_data
    self._func_name, self._instance, self._args, self._kwargs = self.serializer.loads(self.data)
ModuleNotFoundError: No module named 'common'

I tried to use Json serializer, I am still seeing this error. This happens when I pass a python object. It works fine with int or string objects.



Solution 1:[1]

I had to set PYTHONPATH environment variable. It was not able to find the python packages. It has nothing to do with rq serialization

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1