2017-07-14 97 views
0

我是新來的Python,所以請原諒我的無知。我試圖讓一個進程與我的主文件同時運行。我使用的用例是我想在我的flask/python應用程序接受CRUD請求的同時更改遊戲點(爲所有用戶添加/調整點)。我可能可能只是安排這個午夜運行或某事,但在未來,我可能要根據用戶輸入做出多個更改點。基本上,我真的想要使用某種線程功能。線程塊主要在Python

不幸的是,我的線程阻塞了main的操作。我不知道爲什麼,因爲我認爲線程的整體觀點是它同時運行。

下面是我打電話給我的功能從主:

i = Inflate('pants') 
i.timermethod() 

這裏是因爲我已經定義它們的類和方法:

from flask_restful import abort, reqparse, Resource 
from marshmallow import Schema, fields, ValidationError, pre_load 
from flask import Flask, Blueprint, request, jsonify 
from flask_cors import CORS, cross_origin 
import psycopg2 
import os 
from os.path import join, dirname 
import threading 
from time import sleep 

class Inflate: 
    def __init__(self, s): 
     self.s = s 
    def printtest(self): 
     print('insided the printtest for inflation') 
    def hello(self, h): 
     print h + self.s 
    def timermethod(self): 
     h="hello there " 
     for i in range(5): 
      t = threading.Thread(target=self.hello, args=(h,)) 
      t.start() 
      sleep(2) 

輸出是「你好褲」是我的主要功能執行前打印了5次,而我期望/希望「打印褲子」可能只打印一次,當它同時運行時看到主打的其他輸出,然後「繼續打印」以繼續執行。

請讓我知道,如果你有任何想法,我卡住了。

+0

在每次線程啓動後,您都會睡2次,所以每次都會在您開始下一次的時候完成,取消睡眠並且您可能會看到與您的期望更一致的結果,但是您的線程再次做得很少,將在你開始另一個之前完成,所以你仍然可能會看到5'hello' – user3012759

+0

好吧,但是那麼我如何設置一個等待條件每n秒在不阻止main的線程?我需要等待一段時間,然後以某種方式執行另一個線程。 –

+0

爲什麼你需要等待? – user3012759

回答

1

你打電話給i.timermethod(),它在返回前睡5秒2次。

0

睡眠塊。您需要從一個單獨的線程執行timermethod。

嘗試:

t = Thread(target=i.timermethod) 
t.start() 

print "i will print immediately" 

# print test will run 5 times in 5 separate threads, once every 2 secs 

代替:

i.timermethod() 

# print test will run 5 times in 5 separate threads, once every 2 secs 

print "i have to wait for timermethod() to finish" 

#code that gets blocked 

從你的主線程。你需要明確告訴python在它自己​​的線程中調用timermethod,否則它將在main中運行。

+0

確定......但是這並不能解決希望在執行週期之間有一段時間的問題。如果我只是再次執行該線程,它會立即運行它。我需要一個「無阻塞的睡眠」。 –

+0

不,它確實 - 通過在自己的線程中運行timermethod,「睡眠」運行,並因此阻塞,在一個單獨的線程,而不是你的主線程。從自己的線程,你可以睡覺,但你想要的。 –

+0

在您的代碼中,您正在調用主線程中的睡眠並因此阻塞。希望是有道理的 –