Почему я не могу запустить поток в процессе? - PullRequest
2 голосов
/ 14 марта 2020

Я тестирую потоки и процессы в Python, и я сталкиваюсь со странной ошибкой (из моего POV) - я не могу запустить поток в процессе. Почему это так?

Вот пример того, что я сделал:

from multiprocessing import Process
from threading import Thread

def main():
    t1 = Thread(target=printThis, args=["From Thread"])

    p1 = Process(target=printThis, args=["from Process"])
    p2 = Process(target=t1.start)

    p1.start()
    p2.start()

def printThis(word):
    print word

if __name__ == "__main__":
    main()

Вот что я получаю, когда пытаюсь запустить этот код.

Ошибка:

Traceback (most recent call last):
  File "main.py", line 22, in <module>
    main()
  File "main.py", line 13, in main
    p2.start()
  File "c:\python27\Lib\multiprocessing\process.py", line 130, in start
    self._popen = Popen(self)
  File "c:\python27\Lib\multiprocessing\forking.py", line 277, in __init__
    dump(process_obj, to_child, HIGHEST_PROTOCOL)
  File "c:\python27\Lib\multiprocessing\forking.py", line 199, in dump
    ForkingPickler(file, protocol).dump(obj)
  File "c:\python27\Lib\pickle.py", line 224, in dump
    self.save(obj)
  File "c:\python27\Lib\pickle.py", line 331, in save
    self.save_reduce(obj=obj, *rv)
  File "c:\python27\Lib\pickle.py", line 425, in save_reduce
    save(state)
  File "c:\python27\Lib\pickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "c:\python27\Lib\pickle.py", line 655, in save_dict
    self._batch_setitems(obj.iteritems())
  File "c:\python27\Lib\pickle.py", line 687, in _batch_setitems
    save(v)
  File "c:\python27\Lib\pickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "c:\python27\Lib\multiprocessing\forking.py", line 67, in dispatcher
    self.save_reduce(obj=obj, *rv)
  File "c:\python27\Lib\pickle.py", line 401, in save_reduce
    save(args)
  File "c:\python27\Lib\pickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "c:\python27\Lib\pickle.py", line 554, in save_tuple
    save(element)
  File "c:\python27\Lib\pickle.py", line 331, in save
    self.save_reduce(obj=obj, *rv)
  File "c:\python27\Lib\pickle.py", line 425, in save_reduce
    save(state)
  File "c:\python27\Lib\pickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "c:\python27\Lib\pickle.py", line 655, in save_dict
    self._batch_setitems(obj.iteritems())
  File "c:\python27\Lib\pickle.py", line 687, in _batch_setitems
    save(v)
  File "c:\python27\Lib\pickle.py", line 331, in save
    self.save_reduce(obj=obj, *rv)
  File "c:\python27\Lib\pickle.py", line 425, in save_reduce
    save(state)
  File "c:\python27\Lib\pickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "c:\python27\Lib\pickle.py", line 655, in save_dict
    self._batch_setitems(obj.iteritems())
  File "c:\python27\Lib\pickle.py", line 687, in _batch_setitems
    save(v)
  File "c:\python27\Lib\pickle.py", line 306, in save
    rv = reduce(self.proto)
TypeError: can't pickle thread.lock objects
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "c:\python27\Lib\multiprocessing\forking.py", line 381, in main
    self = load(from_parent)
  File "c:\python27\Lib\pickle.py", line 1384, in load
from Process
    return Unpickler(file).load()
  File "c:\python27\Lib\pickle.py", line 864, in load
    dispatch[key](self)
  File "c:\python27\Lib\pickle.py", line 886, in load_eof
    raise EOFError
EOFError

Я что-то здесь не так делаю? Если это так, пожалуйста, укажите это.

...